LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1541|回复: 6

PHP4有共同的基类,并且不想要每次都调用基类的构造函数的方法,如何做。

[复制链接]
发表于 2007-2-1 21:02:33 | 显示全部楼层 |阅读模式

  1. <?php
  2. class CBASE
  3. {
  4.         var $st_AAA = "NULL\n";
  5.         function CBASE()
  6.         {
  7.                 return;
  8.         }

  9. }

  10. class CA extends CBASE
  11. {
  12.         function CA()
  13.         {
  14.                 return;
  15.         }       
  16.         function chdMethodA()
  17.         {
  18.                 $this->st_AAA = "Hello world!";
  19.         }       
  20. }

  21. class CB extends CBASE
  22. {
  23.         function CB()
  24.         {
  25.                 echo $this->st_AAA;
  26.                 return;
  27.         }
  28.        
  29.         function chdMethodB()
  30.         {
  31.                 CA::chdMethodA();
  32.                 echo $this->st_AAA;
  33.         }
  34. }

  35. $cb = new CB();
  36. $cb->chdMethodB();

  37. ?>


复制代码

在这个例子中,我们的CA和CB类有共同的基类CBASE,如果已经实例化了CB,不想再实例化CA,因为CA的构造函数可能是会做一些重复性的工作,是我们所不需要的,那么我们只需要再CB中以静态的方式调用CA中的方法就可以了,这时CA的类甚至没有实例化,但已经可以访问基类中的成员,非常的高效。
大家再比较一下常规的做法:

  1. <?php
  2. class CBASE
  3. {
  4.         var $st_AAA = "NULL\n";
  5.         function CBASE()
  6.         {
  7.                 return;
  8.         }
  9. }

  10. class CA extends CBASE
  11. {
  12.         function CA()
  13.         {
  14.                 return;
  15.         }       
  16.         function chdMethodA()
  17.         {
  18.                 $this->st_AAA = "Hello world!";
  19.         }       
  20. }

  21. class CB extends CBASE
  22. {
  23.         function CB()
  24.         {
  25.                 return;
  26.         }
  27.        
  28.         function chdMethodB()
  29.         {
  30.                 echo $this->st_AAA;
  31.         }
  32. }

  33. $obj1 = new CA();
  34. $obj2 = new CB();
  35. $obj1->chdMethodA();
  36. $obj2->chdMethodB();

  37. ?>
复制代码

即使上述的代码也不能像我们所想的那样工作,基类还是生成成了两个实例,php4也不提供virtual方式的继承,也没有静态成员的概念,所以如果要想在一个应用中只有一个基类被实例化,唯一的选择也就只能写我所推荐的代码了。
发表于 2007-2-2 00:13:32 | 显示全部楼层
先声明,小弟不用 PHP 已经好多年,不用 C++ 也已经好多年,而我所学过的面向对象的语言也就只有这两种,因此,下面的讨论中能有 10% 的内容正确我就满足了。如果怕对自已产生误导,还是跳过我的帖子比较好。

这个问题我想应该从头开始分析比较好。

* 我们之所以要使用面向对象的设计方法,要使用基类,要利用继承,就是希望在基类中实现其子类所共有的方法来避免重复的开发。因此,假如某些代码是要在所有的子类中都需要重新实现的,那么这些代码存在的最好的地方便是基类。因此我认为对类与类之间的关系的设计本身是非常重要的工作,它可以解决 realtang 兄的一点疑问吗?

* 下面再来考虑构造函数的问题。构造函数可以不被执行吗?我记得是不行的,虽然说不出明确的根据,只有隐约的印象:类只要被实例化就一定要执行构造函数(我不记得这是哪种语言中的规则了)。因此这个问题回到了上一问题,即合理设计类与类之间的关系,并把代码放到合适的位置。

* 最后来看一下不实例化而调用友类的方法的问题。在 C++ 中有 friend 的概念,不过我不知道 PHP 有没有。但即使不用友元,在 C++ 中仍然可以不实例化而调用一个类的静态公有方法,如果 PHP 也是这样就好办了。我相信 PHP 是有这些的,因为 realtang 兄在问题中已经指明了这一点。因此问题仍然回到了第一个问题,只要类设计得合理,那么不需要多余的初始化就可以实现我们预期实现的功能。


P.S. 写得有点多。果然晚上还是不要吃太多比较好,非常困,却又睡不着,而且没事做,实在不好受…… 希望上面没有说梦话。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-2-2 11:06:31 | 显示全部楼层
可惜的是,C++所支持的友元以及静态成员,在php4中并没有支持。
回复 支持 反对

使用道具 举报

发表于 2007-2-2 12:56:39 | 显示全部楼层
这样啊,那按照 realtang 兄的想法,我们要如何不实例化 CA 而调用它的方法呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-2-13 10:54:29 | 显示全部楼层
在刚才的例子中,既然CA没有实例化,所以我们用this指针仍然不能访问CA中的成员,只是能访问到基类中的成员而已,just a little trick。
回复 支持 反对

使用道具 举报

发表于 2007-2-13 12:46:09 | 显示全部楼层
晕,这是什么创新点子....用过 java / C++ 的都知道了....

语言语法只是实现需求的不同方式,如果已经有明确需求,那么实现并不困难

回到 LZ 的例,如果 PHP4 支持静态行为,为什么不做一个 helper 类,让 CBASE 和 CA 更加干净?

用面向对象语法,应该清楚“职责分明”这个基本道理。对于一个假设的场景和需求,做测试性质的工作是可以的,但到了实际需求,应该会有更好的解决方案才是。
回复 支持 反对

使用道具 举报

发表于 2007-2-14 23:20:32 | 显示全部楼层
换句话说,如果 PHP4 不能支持静态行为,那为什么不考虑采用 PHP5 或者 Java / C# 呢?

在 PHP4 这个陈旧的脚本语言里钻牛角尖可以带来什么好处么?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表