gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 07:00:06 25 4
gpt4 key购买 nike

我有两个类(class):

抽象实体 , 抽象 ClassA 扩展实体 , ClassB 扩展 ClassA

Entity 是各种实体的通用类,例如 Cars 或 Students。有一个名为 $_entity_name 的静态类变量,它包含 ER 图中实体的确切类名。

大问题:Entity 不能设置这个变量的值,但是会使用它!所以我必须在Entity中定义它,但我不能在ClassA中重新定义它。

ClassA 是一个特殊 ORM 实体的自动生成的基类(比如“学生”)。用户应该继承这个基类来添加他自己的业务逻辑。

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com