我有两门课:
抽象实体,抽象 ClassA 扩展实体,ClassB 扩展 ClassA
Entity 是所有类型实体的通用类,例如汽车或学生。有一个名为 $_entity_name
的静态类变量,它包含 ER 图中实体的确切类名称。
最大的问题:实体无法设置此变量的值,但可以使用它!所以我必须在Entity中定义它,但我不能在ClassA中重新定义它。
ClassA 是一个特殊 ORM 实体(假设为“Student”)自动生成的基类。用户应该继承这个基类来添加他自己的业务逻辑。
ClassB 由用户创建并扩展 ClassA。这是他添加业务逻辑的地方。他不应该触摸 $_entity_name
或设置此值。
我看到的唯一方法是:
ClassA 定义了一个 init() 方法,它将这些“系统级”实例变量初始化为合理的值。
我希望用户根本不必考虑调用任何不寻常的内容。我不知道 PHP 中是否通常也显式调用父类的构造函数。但我想事实并非如此。
问题: A) 在类实例化之后调用 init() 最方便的方法是什么? B) 有没有一种方法可以实现这一点,即创建 ClassB 的用户根本不需要考虑调用 init() ? C) 我还有什么其他选择?
最佳答案
不完全是您问题的答案,但可能是您问题的解决方案:
您可以使用 get_called_class() 而不是包含实际类名的属性(这就是您想要的,不是吗?) (从 php 5.3.0 开始)获取已调用静态函数的类的名称。
class Entity {
public static function foo() {
echo 'name=', get_called_class(), "\n";
}
}
class ClassA extends Entity { }
class ClassB extends ClassA { }
Entity::foo();
ClassA::foo();
ClassB::foo();
打印
name=Entity
name=ClassA
name=ClassB
关于php - 如何在没有构造函数的情况下强制初始化类变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2005787/