论坛首页 编程语言技术论坛

搞不懂php中的面向对象

浏览 20782 次
精华帖 (0) :: 良好帖 (3) :: 新手帖 (0) :: 隐藏帖 (1)
作者 正文
   发表时间:2009-06-18   最后修改:2009-06-18
PHP

 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。真奇怪构造函数也能被覆盖?

   发表时间: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();
0 请登录后投票
   发表时间:2009-06-18  
上面写错了,
#  
#         function __construct(){ 
#         parent::__construct(); //不能少      
#         echo "b"; 
#     } 
0 请登录后投票
   发表时间:2009-06-18  
为什么会在静态方法里调用this??
0 请登录后投票
   发表时间: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()吗?
0 请登录后投票
   发表时间:2009-06-19  
willko 写道
为什么会在静态方法里调用this??

其实我也觉得奇怪,因为静态方法里面竟然还能使用非静态成员!这在java中肯定是要保错的,仔细想想,类在加载的时候根本没初始话非静态成员。而静态方法可以在未初始话之前调用,意思就是可能在非静态成员未赋值的情况下调用静态方法。这在java里面肯定要报错误:未初始化,但在Php中,因为是有默认值的所以就可以通过吧
0 请登录后投票
   发表时间:2009-06-19  
only_java 写道

我这是相对JAVA里面来讲的,你看看java会需要parent::_construct()吗?

残念。。
php不是java,很多理念本来就不一样。
0 请登录后投票
   发表时间:2009-06-19  
关于static的问题,是php语言要保持向前兼容的代价。

如果直接用php5编程,则尽量使用static的本来意义,那么使用方法和java极为类似。

static方法由类直接调用,当然里面不要有this。(即便程序不报错,也别这样用)

非静态方法应该由对象调用,里面可以有this。
0 请登录后投票
   发表时间:2009-06-19  
xieye 写道
only_java 写道

我这是相对JAVA里面来讲的,你看看java会需要parent::_construct()吗?

残念。。
php不是java,很多理念本来就不一样。

那能否帮忙讲下Php里面类实例化到底做了哪些东西呢?
0 请登录后投票
   发表时间: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里面的包了,这样感觉就是把一些相关的函数聚在一起用一个包来管理了。感觉太极端了,这样会不会造成加载时候的性能问题?但这样做确实很方便!

0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics