php - 如何在没有构造函数的情况下强制初始化类变量?

标签 php oop

我有两门课:

抽象实体抽象 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/

相关文章:

php - 如何删除非空目录?

javascript - 面向对象的 JavaScript

PHP : Should I unset objects always after using them?

c++ - 抽象类——C++实践中的隐藏实现

java - 如何创建具有多个(可互换)行为的类

php - 使用通配符过滤关系

php - 用mysql和php打开pdf

php - 在 Laravel 中更改存储路径

php - PayPal Rest API 创建付款不返回销售 ID

oop - 迭代具有不同属性的子类