+ -
当前位置:首页 → 问答吧 → 关于《我刚发现PHP的类原来可以这样用……有人这样吗?静态类……》

关于《我刚发现PHP的类原来可以这样用……有人这样吗?静态类……》

时间:2010-08-04

来源:互联网



由于不能在所谓的“专家交流区”发贴,所以发在这里。(这个限制发贴的sb规定也不知道是谁想出来的,直接导致那个自诩为“专家交流区”的版面里充斥着低水平的讨论)
原文 http://bbs.phpchina.com/thread-190589-1-1.html

这个特性可以称之为PHP的mix-in,结合__call魔术方法,可以实现类似ruby的mixin特性。当然,如果PHP支持友元就更加完美了。
  1. class mixin {
  2.         private $methods = array();
  3.         protected $_mixins;
  4.         function attach($class) {
  5.                 $method = get_class_methods($class);
  6.                 $this->methods += array_fill_keys($method, $class);
  7.         }
  8.         function __call($method, $args) {
  9.                 if (isset($this->methods[$method])) {
  10.                         $class = $this->methods[$method];
  11.                         switch (count($args)) {
  12.                                 case 0: return $class::$method();
  13.                                 case 1: return $class::$method($args[0]);
  14.                                 case 2: return $class::$method($args[0], $args[1]);
  15.                                 case 3: return $class::$method($args[0], $args[1], $args[2]);
  16.                                 case 4: return $class::$method($args[0], $args[1], $args[2], $args[3]);
  17.                                 case 5: return $class::$method($args[0], $args[1], $args[2], $args[3], $args[4]);
  18.                         } //也可以用eval实现,但是不能用call_user_func_array代替。
  19.                 }
  20.         }
  21.         function __construct() {
  22.                 foreach ($this->_mixins as $mixin) {
  23.                         $this->attach($mixin);
  24.                 }
  25.         }
  26. }

  27. class Base1 {
  28.         function test($arg0, $arg1) {
  29.                 echo 'class:',__CLASS__,PHP_EOL;
  30.                 echo 'called_class:', get_called_class(),PHP_EOL;
  31.                 echo 'A::$test:',$this->test,PHP_EOL;
  32.                 echo 'arg0:',$arg0,PHP_EOL;
  33.                 echo 'arg1:',$arg1,PHP_EOL;
  34.         }
  35. }

  36. class Base2 {
  37.         function test2($arg0, $arg1) {
  38.                 echo 'class:',__CLASS__,PHP_EOL;
  39.                 echo 'called_class:', get_called_class(),PHP_EOL;
  40.                 echo 'A::$test:',$this->test,PHP_EOL;
  41.                 echo 'arg0:',$arg0,PHP_EOL;
  42.                 echo 'arg1:',$arg1,PHP_EOL;
  43.         }
  44. }

  45. class A extends mixin {
  46.         protected $_mixins = array('Base1', 'Base2');
  47.         public $test = 'asdasdsad';
  48. }
  49. $a = new A;
  50. $a->test('vvv', 'asd');
  51. $a->test2('ccc', 'aaa');
复制代码




引用 http://bbs.phpchina.com/thread-190589-1-1.html
在a类的某个方法(非静态)用静态的方式调用另一个类的方法时,该方法具备a类里所有的方法和属性……

举例代码:




另一个类menu的样子大概:


注意所有方法都没有static属性。


实际的你们可以自己丰富,我是从我现有项目中脱离出来简单写的一个例子,项目是公司的不能随意把代码贴出来给各位实践,有兴趣的朋友可以自己丰富。、


我是因为在做项目的时候发现方法应该写在另一个类里,于是从权限类,拷贝到了菜单类里,但执行的时候竟然发现了这个问题……

很多人都不知道可以这样用,事实上我也认为这样会搞混淆,但确实可以省去一些重新获取变量值的动作。

作者: 四不象   发布时间: 2010-08-04

http://bbs.phpchina.com/viewthre ... p;extra=&page=1

作者: 绿霸花季护航   发布时间: 2010-08-04