Luk*_*uke 0 php class class-variables
如果我有一个类(如下所示)并且在函数中我设置了一个变量(下面:$ this-> example)但是我还没有在类的顶部声明变量(例如var $ example;)我在哪里以及如何用这个变量?我尝试在另一个函数中直接使用它但它没有用(我想我可能犯了一个错误,但它在我在类的顶部声明它之后起作用了)
我在Symfony中已经看到了这个用于设置你可以在视图中使用的变量的内容,而且我在Phorms中也提到了它,并列举了几个例子.
很抱歉,如果这很明显,我只想了解如何使用这些变量,包括获取变量的名称(例如$ this-> example,by name我的意思是"example").
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
}
}
Run Code Online (Sandbox Code Playgroud)
任何帮助将非常感激
问候
卢克
编辑:( 从我对DrColossus的回复)
我希望能够在函数中设置任何变量名,并在另一个函数中获取任何使用name设置的变量.例如在Symfony中我可以在动作类函数中设置$ this-> completly_random_name = $ x,然后在视图中我可以使用$ completly_random_name.symfony无法在父类的顶部设置变量名的所有可能组合.
Ais*_*ina 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
}
}
Run Code Online (Sandbox Code Playgroud)
为什么你不应该这样做.
在我看来,使用魔术__get和__set函数会促进糟糕的编程实践.让我演示一个着名的例子:如果玻璃是半满的,那么玻璃是半满的还是半空的?从程序员的角度来看,正确的答案是玻璃太大了.我的意思是,当你添加如上所示的魔术函数时,你可以继续分配变量,它不会关心,但它们是否必要?
随着时间的推移,您的代码将会发生变化,您可能不再需要先前分配的旧变量.通常,您只需删除变量声明,这意味着您的类现在将消耗更少(不需要的)内存.如果您忘记删除其中一项旧任务,您很快就会发现.使用魔术功能,您如何跟踪您需要哪些变量,哪些变量不需要?
请记住,代码应该主要供人类阅读,其次才是机器执行.如果第二个人加入你,他想知道他在视图中可以访问哪些变量,他要么必须通过代码分配变量,要么print_r($this->myMagicData)不只是查看变量所在的类的部分.声明.
而且,当然,还有被调用的魔术函数的开销,根据情况可能会或可能不会引起关注.
因此,总而言之,手动声明所需的变量有助于:
希望这可以帮助!