考虑以下父类Parent.php
:
class Parent {
protected static $className;
public static function __static() {
static::$className = get_called_class();
}
public static function doSomething1() { ... }
public static function doSomething2() { ... }
public static function doSomething3() { ... }
}
Parent::__static();
及其子类Child.php
:
class Child extends Parent { }
每个方法doSomething
1-3都需要访问$className
。如果Child
拨打doSomething1()
,$className
必须为Child
,不 Model
。我当然可以做到
public static function doSomething() { $className = get_called_class(); }
在每个方法中但这会导致代码重复。另外,$className
最有意义地被宣布为静态。我使用的解决方法是在Parent
中的类声明之后调用static class initializer。显然这也没有用,因为变量$class
仍然在Parent
上而不是在Child
上启用,尽管使用{{1 (即后期绑定)。
长话短说,如何获得以下:
static
让我稍微复杂一点:我有多个子类,Child::doSomething1(); // -> $className must be 'Child'
Child::doSomething2(); // -> $className must be 'Child'
Child::doSomething3(); // -> $className must be 'Child'
,Child1
,Child2
,所以将Child3
放在每个ChildX::__static();
类中的文件结尾都是低效的。
BONUS :如果我在ChildX
中致电doSomething1()
,这是否意味着Child1
和Child2
将共享一个静态属性{{1值Child3
?我的猜测不是,但我很乐意听到你的观点。
对此有何想法?