您的位置:首页 > 编程语言 > PHP开发

php面向对象知识

2013-12-18 14:39 295 查看
php面向对象感觉总是那么的别扭,好像根本只是在套用面向对象编程语言的形式,而实际情况和真正的面向对象差别很大,例如在构建一个导出类对象时,其基类对象的构造方法根本就不会被调用,从这一点上看,php的面向对象就不能算是面向对象的语言,至少只能算半个面向对象,php继承的只是基类的公有方法和公有属性,继承下来的只是方法和属性而已,在创建导出类对象时并不会去调用基类的构造方法,如果基类方法刚好调用的属性在构造方法里初始化那么这个属性的值其实为空,并没有被初始化,看下面的例子。

class base {
	function base(){echo 'base';
		$this->name='lily';
	}
	function getName(){
		return $this->name;
	}
	private $name;
}
class son extends base {
	function son(){ 
	}
	function getBaseName(){
		return $this->getName();
	}
	//public $name='sonson';
}
$obj= new son();
echo $obj->getBaseName();
我们以为上面的例子最后会显示lily,可实际情况就是返回结果为空,这说明什么?说明php的面向对象特性并非是真正的面向对象,而如果要让基类的name返回有意义的结果,只有两种办法:一:直接在getName()方法里面对属性name进行赋值;二:在private $name一行直接对其进行赋值,那么结果返回的就是你要的结果。

下面来讲另外一个问题:

php在用导出类的方法去访问基类的方法时,如果导出类有一个属性与基类相同,那么你访问基类的方法期望获得基类的属性值时发现其实还是子类的值(也就是相当于被覆盖了)看下面的例子。

class base {
	function base(){echo 'base';
		$this->name='lily';
	}
	function getName(){
		return $this->name;
	}
	public $name='jimmy';
}
class son extends base {
	function son(){ 
		$this->name='son';
	}
	function getBaseName(){
		return $this->getName();
	}
	//public $name='sonson';
}
$obj= new son();
echo $obj->getBaseName();
结果并不是jimmy,而是son!,细心的人可能发现上面的例子有一个地方改动了,那就是基类的属性访问方法改动了,原先是private,现在改成了public,这是有关系的!如果把基类的访问符改成private,那么基类的属性值就不会被子类同样的属性覆盖。这里面其实是$this指针的问题,在子类里访问基类的方法时,那么基类方法的$this其实并不指向基类,而是指向子类的。由于属性值为$public,所以子类就可以修改基类的属性,这就是为什么返回结果会是son的原因,而基类的name属性改成private,就代表是私有的值,只能通过方法来访问,而这个方法就是基类的getName(),也就是在创建子类对象的时候并不能因为修改子类的name值时也一并修改掉基类的name属性值,这一点也确实和面向对象特性有点类似。因为private属性并不能被继承下来。总的来说,php的继承机制只允许继承其基类的公共方法(不包括构造方法和私有的方法,那样就有点乱套了)和公有属性值
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: