我有一个具有多个公共属性的类,其对象正在系统的不同部分中使用。问题是我需要在我使用类对象的每个地方只加载一些公共属性,因为每次加载整个属性列表都需要永远。
有什么方法可以使用__autoload
或类似的函数来调用在调用它们时加载不同变量的函数?
E.g。
class Bread {
public
$Ingredients,
$Price,
$Color;
public function magicLoading($var) {
switch($var) {
case "Ingredients" : return loadIngredients();
case "Price" : return loadPrice();
case "Color" : return loadColor();
default : break;
}
}
public function loadIngredients() {
$this->Ingredients = ...
}
}
foreach($Bread->Ingredients as $Ingredient) {
//do stuff here
}
答案 0 :(得分:1)
向我的同事道歉,他们发布的内容看起来像是一个重复的答案,但他们错过了一些东西。
为了使__get()
和__set()
挂钩正常工作,问题中的成员变量根本无法声明 - 只是声明但未定义是不够的
这意味着您必须删除您希望以这种方式访问的任何变量的声明(即public $Ingredients;
等)
因此,你的班级可能会是这样的。
class Bread
{
/* No variable declarations or the magic methods won't execute */
protected function loadIngredients()
{
$this->Ingredients = ...
}
public function __get( $var )
{
switch( $var )
{
case "Ingredients" : $this->loadIngredients(); break;
case "Price" : $this->loadPrice(); break;
case "Color" : $this->loadColor(); break;
default : throw new Exception( "No case for $var" );
}
return $this->$var;
}
}
答案 1 :(得分:1)
在您的代码中,
magicLoading
重命名为__get
,load...
”方法它有效!
答案 2 :(得分:0)
是的,您可以创建每次读取类的属性(尚未初始化)时调用的魔术方法__get。