【发布时间】:2014-12-22 21:26:08
【问题描述】:
我有一种情况,我希望仅在实际访问类属性时才对其进行初始化,因为初始化该属性包括可能不必要的数据库调用。我可以使用 getter 方法,但这似乎有点矫枉过正,不断地调用这个方法(我希望该属性就在那里,因为它在 90% 的时间里被非常频繁地使用)。
所以我在考虑使用 PHP 的 overloading,经过一些测试,它似乎工作正常。
class MyClass
{
public function getName()
{
return 'Bob';
}
public function doSomething()
{
var_dump($this->name);
var_dump($this->name);
var_dump($this->name);
}
public function __get($property)
{
var_dump('Getting property.');
if($property == 'name') {
$this->name = $this->getName();
return $this->name;
}
}
}
在这里调用 doSomething() 正是我想要的:
string(17) "获取属性。"
字符串(3)“鲍勃”
字符串(3)“鲍勃”
字符串(3)“鲍勃”
第一次通过 getName() 方法获取属性,随后的属性现在直接设置并且可以正常访问。
所以这就是我想要的。不是在初始化类时设置 $this->name,而是在第一次访问时设置它。我知道即时响应可能是我可以直接调用 getName(),但对于这种特殊情况,我宁愿通过属性访问。该属性当前在类初始化时永久设置,无论是否被访问。
编辑:为了澄清起见,该属性实际上是现实世界应用程序中的 Eloquent 对象,而不是包含名称的字符串!以上只是我创建的示例,用于测试我的潜在解决方案是否可以正常工作,并显示我想要做什么。此外,还有一些这些属性。在没有被访问的情况下,我宁愿不初始化属性。
我的问题。这是对重载的合理使用,还是会被其他开发人员普遍反对?性能方面,考虑到重载仅用于第一次访问,这一切都好吗?
谢谢
【问题讨论】:
-
为什么大家都卡在90年代,好像我们的网站都跑在386上。用默认值实例化一个字符串会杀死服务器还是什么?我们必须求助于这种东西来节省几个字节的 RAM,就像我们仍然在最大只有 512k 的机器上一样?
-
你的瓶颈会出现在访问文件的东西上,比如读取会话,而不是访问内存中的变量。如果你真的很在意,不要使用 PHP。严肃地说,PHP 是一种脚本语言,因此根据定义,每个请求都会使用更多内存。不仅如此,还有关联数组,而不仅仅是数字索引?哈哈。而且您担心直接调用成员而不是通过getter。来吧。
-
为什么我们不回去将 5 或 6 个布尔标志打包到一个 int 中,同时进行二进制操作。
-
您对我的问题的居高临下和讽刺的态度是不受欢迎的。人们来这里是为了提问和学习,而不是被嘲笑。你也没有真正回答我的问题。我要求澄清您关于属性访问与方法调用的第一条评论,是否有任何区别以及以何种速率(100 次调用、1000 次调用、10000 次调用等)。您回答说文件读取量更大,可能是瓶颈,这很明显,但不是问题所问的。
-
顺便说一句,我刚刚在您的第一条评论中注意到您写道“使用默认值实例化一个字符串会杀死服务器吗?”。该属性是一个 Eloquent 对象,涉及数据库查询以将其拉起,而不是默认字符串值!我将在我的问题中澄清这一点。此外,在现实世界的应用程序中,这些属性中的一些包含不同的对象。
标签: php overloading magic-methods