<?php
class_a::init();
class class_a{
public static $other_class_name = 'class_b';
public static function init(){
$other_class_name = self::$other_class_name; //一定要这样赋值才能 work 吗?
$other_class_name::init(); //不能直接写 self::$other_class_name::init(),郁闷
//有办法不用去赋值,直接写静态变量作为类名来调用 class_b 的方法吗?
}
}
class class_b{
public static function init(){
echo 'i am class_b';
}
}
class class_c{
public static function init(){
echo 'i am class_c';
}
}
1
haiyang416 2015-01-05 12:39:03 +08:00 1
call_user_func(array(self::$other_class_name, 'init'));
只想到这个,写两行有什么不好么? |
2
fising 2015-01-05 12:46:32 +08:00 1
self::$other_class_name::init()
明显不对啊。 self::$other_class_name 得到的是字符串 'class_b' 你能对字符串调用静态方法init? |
3
hitsmaxft 2015-01-05 12:49:54 +08:00 1
这些属于php语法分析的bug,用 call user func 绕开
|
4
raincious 2015-01-05 12:51:51 +08:00 2
PHP现在T_PAAMAYIM_NEKUDOTAYIM的解析有点“未完待续”。5.3的时候连$variable::method();的语法都无法解析。
到5.6还是不能将::串联起来,必须在函数/方法体内本地化一个变量才可以。哪怕你制造一个静态方法: function static class getClass() { return static::$other_class_name; } 然后 static::getClass()::init(); 都不行。 所以目前只能用一楼的方法,只是效率比较低。 |
5
kmvan OP @raincious 所以目前只能用一楼的方法,只是效率比较低。
其实还有一种写法,就是用 eval,不过效率恐怕比一楼的还要低。 我还想问一下,$other_class_name::init(); 这种写法,应该不是叫可变变量吧,有专用的名词吗?可变变量是 $$name 这样子的。 |
6
kmvan OP @haiyang416 只想到这个,写两行有什么不好么?
对于病患来说,写多半行都觉得整个人不好了。 |
7
kmvan OP @haiyang416 call_user_func(array(self::$other_class_name, 'init'));
这个估计不行吧,因为他是静态方法,不会报错吗? |
8
haiyang416 2015-01-05 13:21:21 +08:00
@kmvan 不要说你认为不行。你应该先上代码实验或者翻阅对应的手册。
|
9
kmvan OP @haiyang416 不要说你认为不行。你应该先上代码实验或者翻阅对应的手册。
类型不标准,虽然不是error错误,但也报提示: Strict standards: call_user_func() expects parameter 1 to be a valid callback, non-static method class_b::init() should not be called statically |
10
picasso250 2015-01-05 13:43:18 +08:00
|
11
raincious 2015-01-05 14:13:18 +08:00
@kmvan
我这里改成这样: https://gist.github.com/anonymous/5e7191f4fd142249d06b 运行没有问题。你可能错在别的地方了,比如init没声明static? call_user_func这个函数可以看作支持某种程度上的“多态”。 比如(如果有错请指正): call_user_func('FunctionName'); // 这样是调用函数(静态的) call_user_func(array('ClassName', 'MethodName')); // 这样就是调用静态方法。 $instance = new class(); call_user_func(array($instance, 'MethodName')); // 这样就是调用实例方法。 |
12
haiyang416 2015-01-05 14:14:36 +08:00
|
13
laoyuan 2015-01-05 14:55:37 +08:00
好问题,正在看《PHP核心技术与最佳实践》里讲多态的一节
|
14
LuckyHJH 2015-01-05 16:49:28 +08:00
我遇到的问题是,new $class_name() 就会报错,PHP5.3.3,不知道是否同一个问题
|
15
haiyang416 2015-01-05 17:03:34 +08:00 1
|
16
LuckyHJH 2015-01-05 17:14:54 +08:00
感谢15楼,另外话说为什么每次打开这个页面,都总在11楼那里卡一卡 - -
|
17
sumhat 2015-01-05 18:50:27 +08:00
我来歪个楼。不太懂 PHP,但是为什么一定要用静态方法,不能直接扔一个实例进去么?
|
18
ichou 2015-01-05 22:33:06 +08:00
为什么我是第一次见这种用法 。。。
大大们可以解释一下使用场景么? |