锁定老帖子 主题:搞不懂php中的面向对象
精华帖 (0) :: 良好帖 (3) :: 新手帖 (0) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2009-06-18
最后修改:2009-06-18
php5的面向对象虽然加强了很多,但还有很多东西比起java的面向对象弱了很多。有些东西甚至让人费解,就比如下面的代码,b extends a ,实例化b时a的构造函数却没执行?不知道实例化b时,php到底是则么执行的,高手来帮忙解惑!还有php的static成员竟然能在非static方法中使用,还好反过来会报错。好了,先贴代码
class a { function __construct() { echo "a"; } } class b extends a{ function __construct(){ echo "b"; } private $x=100; public static function getx(){ return $this->x; } } $x=new b(); echo $x->getx(); 结果是: b100 “a”竟然没有输出,真不知到php里类初始化的顺序 补充: 刚刚发现,原来是b的构造函数覆盖了a的构造函数,把b的构造函数去掉,就能输出a。真奇怪构造函数也能被覆盖? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-06-18
楼主呀,基础不扎实。。
通常的写法是: class a { function __construct() { echo "a"; } } class b extends a{ parent::__construct(); //不能少 function __construct(){ echo "b"; } private $x=100; public function getx(){ return $this->x; } } $x=new b(); echo $x->getx(); |
|
返回顶楼 | |
发表时间:2009-06-18
上面写错了,
# # function __construct(){ # parent::__construct(); //不能少 # echo "b"; # } |
|
返回顶楼 | |
发表时间:2009-06-18
为什么会在静态方法里调用this??
|
|
返回顶楼 | |
发表时间:2009-06-19
xieye 写道 楼主呀,基础不扎实。。
通常的写法是: class a { function __construct() { echo "a"; } } class b extends a{ parent::__construct(); //不能少 function __construct(){ echo "b"; } private $x=100; public function getx(){ return $this->x; } } $x=new b(); echo $x->getx(); 我这是相对JAVA里面来讲的,你看看java会需要parent::_construct()吗? |
|
返回顶楼 | |
发表时间:2009-06-19
willko 写道 为什么会在静态方法里调用this??
其实我也觉得奇怪,因为静态方法里面竟然还能使用非静态成员!这在java中肯定是要保错的,仔细想想,类在加载的时候根本没初始话非静态成员。而静态方法可以在未初始话之前调用,意思就是可能在非静态成员未赋值的情况下调用静态方法。这在java里面肯定要报错误:未初始化,但在Php中,因为是有默认值的所以就可以通过吧 |
|
返回顶楼 | |
发表时间:2009-06-19
only_java 写道 我这是相对JAVA里面来讲的,你看看java会需要parent::_construct()吗? 残念。。 php不是java,很多理念本来就不一样。 |
|
返回顶楼 | |
发表时间:2009-06-19
关于static的问题,是php语言要保持向前兼容的代价。
如果直接用php5编程,则尽量使用static的本来意义,那么使用方法和java极为类似。 static方法由类直接调用,当然里面不要有this。(即便程序不报错,也别这样用) 非静态方法应该由对象调用,里面可以有this。 |
|
返回顶楼 | |
发表时间:2009-06-19
xieye 写道 only_java 写道 我这是相对JAVA里面来讲的,你看看java会需要parent::_construct()吗? 残念。。 php不是java,很多理念本来就不一样。 那能否帮忙讲下Php里面类实例化到底做了哪些东西呢? |
|
返回顶楼 | |
发表时间:2009-06-19
xieye 写道 关于static的问题,是php语言要保持向前兼容的代价。
如果直接用php5编程,则尽量使用static的本来意义,那么使用方法和java极为类似。 static方法由类直接调用,当然里面不要有this。(即便程序不报错,也别这样用) 非静态方法应该由对象调用,里面可以有this。 老兄这些你说是正确的,但好像你搞错了吧?成员$x是非静态的,仔细看我的回复! 这里应该分为两种情况吧? 1.静态方法调用非静态成员 这种就是我发的代码中的情况,少见,一般不会这样做 2.普通方法调用静态方法 这种情况,一般用来注册类中的某个成员,比如zf中 Zend_Db_Table::setDefaultAdapter($dbAdapter); 在Zend_db_table中注册$dbAdapter 。 然后用 普通方法调用静态方法(此方法获取静态成员的值) 比较实用,对于静态方法的使用。我觉得有时候容易过度,像我们公司现在一个类下面基本上是静态方法,这样下来类变成了类似java里面的包了,这样感觉就是把一些相关的函数聚在一起用一个包来管理了。感觉太极端了,这样会不会造成加载时候的性能问题?但这样做确实很方便! |
|
返回顶楼 | |