如果我有一个类(如下所示)并且在函数中我设置了一个变量(下面:$ this->示例)但我没有在类的顶部声明变量(例如var $ example;)其中以及如何使用此变量?我试着在另一个函数中直接使用它但是它没有用(我想我可能犯了一个错误,但它在我在类的顶部声明它之后起作用了)
我在Symfony中已经看到了这个用于设置你可以在视图中使用的变量的东西,而且我还在Phorms中找到了它,并列举了几个例子。
很抱歉,如果这很明显,我只想了解如何使用这些变量,包括获取变量的名称(例如$ this->示例,按名称我的意思是“示例”)。
class ExampleClass{
var $another_var;
function __construct($data){
$this->example = $data;
$this->another_var = $data;
}
function exampleFunction(){
$test = $this->example; //this doesnt work
$another_test = $this->another_var; //this obviously does
}
}
非常感谢任何帮助
此致
路
编辑:(来自我对DrColossus的回复)
我希望能够在函数中设置任何变量名,并在另一个函数中获取使用该名设置的任何变量。例如在Symfony中我可以在动作类函数中设置$ this-> completly_random_name = $ x,然后在视图中我可以使用$ completly_random_name。 symfony无法在父类的顶部设置变量名的所有可能组合。
答案 0 :(得分:10)
通过谈论你通常不应该这样做,你可以使用PHP的神奇__get
和__set
函数来完成你想要的任务。
class MyClass {
// add one member var that holds all the data
private $myMagicData = array();
private $another_var;
function __construct($data){
$this->example = $data; // this will auto-call the __set function
$this->another_var = $data; // this won't, since $this->another_var was declared above
}
function __get($name) {
return array_key_exists($name, $this->myMagicData) ? $this->myMagicData[$name] : null;
}
function __set($name, $value) {
$this->myMagicData[$name] = $value;
}
function exampleFunction(){
$test = $this->example; // this will auto-call the __get function
$another_test = $this->another_var; // this won't
}
}
Documentation on these and other magic functions.
为什么你不应该这样做。
在我看来,使用魔术__get
和__set
函数会促进糟糕的编程习惯。让我演示一个着名的例子:如果玻璃是半满的,那么玻璃是半满的还是半空的?从程序员的角度来看,正确答案是玻璃太大。我的意思是,当你添加如上所示的魔术函数时,你可以继续分配变量,它不关心,但它们是否必要?
随着时间的推移,您的代码将会发生变化,您可能不再需要先前分配的旧变量。通常,您只需删除变量声明,这意味着您的类现在将消耗更少(不需要的)内存。如果您忘记删除其中一项旧任务,您很快就会发现。使用魔术功能,您将如何跟踪您需要哪些变量,哪些变量不需要?
请记住,代码应该主要供人类阅读,其次才是机器执行。如果第二个人加入你,他想知道他在视图中可以访问哪些变量,他要么必须通过代码分配变量,要么print_r($this->myMagicData)
,而不是仅仅查看声明变量的类。
当然,还有调用魔术函数的开销,根据具体情况可能会或可能不会引起关注。
因此,总而言之,手动声明所需的变量有助于:
希望这有帮助!
答案 1 :(得分:2)
class ExampleClass{
private $another_var;
private $example;
public function __construct($data){
$this->example = $data;
$this->another_var = $data;
}
public function getExample() {
return $this->example;
}
public function setExample($example) {
$this->example = $example;
}
public function exampleFunction()
$test = $this->example; //now that you have a private $example, this will work
$another_test = $this->another_var; //this obviously does
}
}
使用公开的Getters / Setter访问私有变量。
修改强> Aistina比我快,他的例子展示了如何访问/检索任何变量名称。
答案 2 :(得分:0)
默认情况下,类属性被定义为public,但您不应该这样做。 你应该定义private / protected属性,并定义getter / setter方法,以便从类外部使用它们。之后维护起来要容易得多......
答案 3 :(得分:0)
我不是这方面的专家,但是我的OO条件Mind告诉我,不管用什么语言都不要定义类成员变量。
您提到的框架是否在子类中使用此模式,其中成员是在超类中定义的?
关于第二个问题:你应该看一下php的reflection classes Reflection帮助您了解类的结构(构造函数,方法,属性)。