关于《我刚发现PHP的类原来可以这样用……有人这样吗?静态类……》
时间:2010-08-04
来源:互联网
由于不能在所谓的“专家交流区”发贴,所以发在这里。(这个限制发贴的sb规定也不知道是谁想出来的,直接导致那个自诩为“专家交流区”的版面里充斥着低水平的讨论)
原文 http://bbs.phpchina.com/thread-190589-1-1.html
这个特性可以称之为PHP的mix-in,结合__call魔术方法,可以实现类似ruby的mixin特性。当然,如果PHP支持友元就更加完美了。
- class mixin {
- private $methods = array();
- protected $_mixins;
- function attach($class) {
- $method = get_class_methods($class);
- $this->methods += array_fill_keys($method, $class);
- }
- function __call($method, $args) {
- if (isset($this->methods[$method])) {
- $class = $this->methods[$method];
- switch (count($args)) {
- case 0: return $class::$method();
- case 1: return $class::$method($args[0]);
- case 2: return $class::$method($args[0], $args[1]);
- case 3: return $class::$method($args[0], $args[1], $args[2]);
- case 4: return $class::$method($args[0], $args[1], $args[2], $args[3]);
- case 5: return $class::$method($args[0], $args[1], $args[2], $args[3], $args[4]);
- } //也可以用eval实现,但是不能用call_user_func_array代替。
- }
- }
- function __construct() {
- foreach ($this->_mixins as $mixin) {
- $this->attach($mixin);
- }
- }
- }
-
- class Base1 {
- function test($arg0, $arg1) {
- echo 'class:',__CLASS__,PHP_EOL;
- echo 'called_class:', get_called_class(),PHP_EOL;
- echo 'A::$test:',$this->test,PHP_EOL;
- echo 'arg0:',$arg0,PHP_EOL;
- echo 'arg1:',$arg1,PHP_EOL;
- }
- }
-
- class Base2 {
- function test2($arg0, $arg1) {
- echo 'class:',__CLASS__,PHP_EOL;
- echo 'called_class:', get_called_class(),PHP_EOL;
- echo 'A::$test:',$this->test,PHP_EOL;
- echo 'arg0:',$arg0,PHP_EOL;
- echo 'arg1:',$arg1,PHP_EOL;
- }
- }
-
- class A extends mixin {
- protected $_mixins = array('Base1', 'Base2');
- public $test = 'asdasdsad';
- }
- $a = new A;
- $a->test('vvv', 'asd');
- $a->test2('ccc', 'aaa');
引用 http://bbs.phpchina.com/thread-190589-1-1.html
在a类的某个方法(非静态)用静态的方式调用另一个类的方法时,该方法具备a类里所有的方法和属性……
举例代码:
另一个类menu的样子大概:
注意所有方法都没有static属性。
实际的你们可以自己丰富,我是从我现有项目中脱离出来简单写的一个例子,项目是公司的不能随意把代码贴出来给各位实践,有兴趣的朋友可以自己丰富。、
我是因为在做项目的时候发现方法应该写在另一个类里,于是从权限类,拷贝到了菜单类里,但执行的时候竟然发现了这个问题……
很多人都不知道可以这样用,事实上我也认为这样会搞混淆,但确实可以省去一些重新获取变量值的动作。
在a类的某个方法(非静态)用静态的方式调用另一个类的方法时,该方法具备a类里所有的方法和属性……
举例代码:
另一个类menu的样子大概:
注意所有方法都没有static属性。
实际的你们可以自己丰富,我是从我现有项目中脱离出来简单写的一个例子,项目是公司的不能随意把代码贴出来给各位实践,有兴趣的朋友可以自己丰富。、
我是因为在做项目的时候发现方法应该写在另一个类里,于是从权限类,拷贝到了菜单类里,但执行的时候竟然发现了这个问题……
很多人都不知道可以这样用,事实上我也认为这样会搞混淆,但确实可以省去一些重新获取变量值的动作。
作者: 四不象 发布时间: 2010-08-04
http://bbs.phpchina.com/viewthre ... p;extra=&page=1
作者: 绿霸花季护航 发布时间: 2010-08-04
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28