介绍:如果父类有私有的属性。那么父类的方法只为父类的私有属性服务。
以下这个例子在子类中重新定义了一个属性$sal,系统却返回了父类的属性。
<?
class employee{
private $sal=3000;
//protected $sal=3000;
public function getSal(){
return $this->sal;
}
}
class Manager extends employee {
protected $sal=5000;
public function getParentSal(){
//这里返回的是父类的private属性.
return parent::getSal();
}
}
$manager = new Manager();
echo "PHP ".phpversion()."<br>";
echo $manager->getSal();
echo "<br>";
echo "parent's \$sal ".$manager->getParentSal();
?>
程序运行结果:
PHP 5.3.8
3000
parent's $sal 3000
如果父类中的属性被子类重写了。
结果是这样的。注意 第5行的属性定义变成了protected。
<?
class employee{
//private $sal=3000;
protected $sal=3000;
public function getSal(){
return $this->sal;
}
}
class Manager extends employee {
protected $sal=5000;
public function getParentSal(){
//这里返回的是父类的private属性.
return parent::getSal();
}
}
$manager = new Manager();
echo "PHP ".phpversion()."<br>";
echo $manager->getSal();
echo "<br>";
echo "parent's \$sal ".$manager->getParentSal();
?>
程序运行结果:
PHP 5.3.8
5000
parent's $sal 5000
第一个列子中 父类的private $sal没有被重写 所以$manager->getSal()这个父类的方法 调用的是父类自己的私有属性$sal 此时内存中有两个$sal
第二个列子中 父类的protected $sal被重写 $manager->getSal()这个父类的方法 调用已经被重写的$sal 父类的$sal在内存中是不存在的 此时内存中只有一个$sal
接下来看第三个列子
子类中重写的方法对当前private有效。
<?
class employee{
private $sal=3000;
public function getSal(){
return $this->sal;
}
}
class Manager extends employee {
private $sal=5000;
//重写过的方法
public function getSal(){
return $this->sal;
}
public function getParentSal(){
//这里返回的是父类的private属性.
return parent::getSal();
}
}
$manager = new Manager();
echo "PHP ".phpversion()."<br>";
echo $manager->getSal();
echo "<br>";
echo "parent's \$sal ".$manager->getParentSal();
?>
运行结果
PHP 5.3.8
5000
parent's $sal 3000
这个列子中子类重写getSal()方法 所以他调用的是子类的属性
如果你注释子类的这一行
//private $sal=5000;
你会发现一个错误:Notice: Undefined property: Manager::$sal in E:\wamp\www\oo\2-5\2-5-3.php on line 14
如果注释掉12行的子类重写方法 那么echo $manager->getSal();得到的结果是 父类的私有属性$sal 3000
打开zend调试状态看看,内存中的情况。注意最下面,有两个$sal 。分别是 3000 和 5000 。
class employee{
private $sal=3000;
public function getSal(){
return $this->sal;
}
}
class Manager extends employee {
protected $sal=5000;
public function getParentSal(){
return $this->sal;
}
}
$manager = new Manager();
echo "PHP ".phpversion()."<br>";
echo $manager->getSal();
?>
程序运行结果:
PHP 5.3.8
3000
将父类的属性$sal 改成 protected ,子类重写了父类的属性。在内存中只有一个 $sal 。
class employee{
protected $sal=3000;
public function getSal(){
return $this->sal;
}
}
class Manager extends employee {
protected $sal=5000;
public function getParentSal(){
return $this->sal;
}
}
$manager = new Manager();
echo "PHP ".phpversion()."<br>";
echo $manager->getSal();
?>
程序运行结果:
PHP 5.3.8
5000
注意:
PHP5调用父类用的是parent:: 而不是 parent-> ,这足以说明PHP5不想在内存中让父类也被创建。
PHP5想让继承变的比Java更简单。
百度网盘外链不能在网页里直接使用图片,做了一个小功能,准备放在博客里分享图片。
文件名:bdp.php
<?php
require_once('snoopy.class.php');
//http://www.abc.com/bdp.php?shareid=29160&uk=2855065916
$url = 'http://pan.baidu.com/share/link?shareid=' . $_GET['shareid'] . '&uk=' . $_GET['uk'];
$snoopy = new Snoopy();
$snoopy -> read_timeout = 0;
$snoopy -> fetch($url);
$n = $snoopy -> results;
$regex = '/(_.src="/blog_article/)(. )(";)/';
$match = '';
preg_match($regex, $n, $match);
if(preg_match('/.gif/', $match[2])){
header("Content-type: image/gif");
imagegif(imagecreatefromgif($match[2]));
}elseif(preg_match('/.jpg/', $match[2])){
header("Content-type: image/jpeg");
imagejpeg(imagecreatefromjpeg($match[2]));
}elseif(preg_match('/.png/', $match[2])){
header("Content-type: image/png");
imagepng(imagecreatefrompng($match[2]));
}elseif(preg_match('/.wbmp/', $match[2])){
header("Content-type: image/vnd.wap.wbmp");
imagewbmp(imagecreatefromwbmp($match[2]));
}else{}
?>
snoopy.class.php是一个php类,用来模仿web浏览器的功能,它能完成获取网页内容和发送表单的任务。
这个文件自己搜索下载吧。以上文件需要一个支持PHP的空间。百度网盘上传图片并发布分享,取得分享地址后的 shareid=29160&uk=2855065916 参数。
使用 http://你的域名/bdp.php?shareid=29160&uk=2855065916 得到图片,这个地址可以放在CKEditor图像地址中使用。其它编辑器应该也可以。
网页中直接使用:<img src='http://你的域名/bdp.php?shareid=29160&uk=2855065916' /> 。
在php手册中遇到一个没想明白的问题,记录在此,方便需要的朋友。
class Bar
{
public function test() {
$this->testPrivate();
$this->testPublic();
}
public function testPublic() {
echo "Bar::testPublic\n";
}
private function testPrivate() {
echo "Bar::testPrivate\n";
}
}
class Foo extends Bar
{
public function testPublic() {
echo "Foo::testPublic\n";
}
private function testPrivate() {
echo "Foo::testPrivate\n";
}
}
$myFoo = new foo();
$myFoo->test(); // Bar::testPrivate
// Foo::testPublic
为什么第一行会输出Bar::testPrivate呢?
一些资料:
本文夹中的7中的内容
在php官网上,关于这段代码的贡献者回复:
http://www.php.net/manual/zh/language.oop5.visibility.php#87413