Php 在类函数中设置变量,在哪里可以使用该变量
如果我有一个类(如下所示),并且在一个函数中设置了一个变量(如下:$this->example),但是我没有在类的顶部声明变量(例如var$example;),在哪里以及如何使用这个变量?我试着直接在另一个函数中使用它,但它不起作用(我想我可能犯了一个错误,但在我在类的顶部声明它后,它起了作用) 我在Symfony中看到了这一点,用于设置可以在视图中使用的变量,我在Phorms中也看到了这一点,并举了几个例子 抱歉,如果这是显而易见的,我只想了解如何使用这些变量,包括获取变量的名称(例如$this->example,我所说的名称是“example”) 任何帮助都将不胜感激 问候 卢克 编辑:(摘自我对巨像博士的回复)Php 在类函数中设置变量,在哪里可以使用该变量,php,class,class-variables,Php,Class,Class Variables,如果我有一个类(如下所示),并且在一个函数中设置了一个变量(如下:$this->example),但是我没有在类的顶部声明变量(例如var$example;),在哪里以及如何使用这个变量?我试着直接在另一个函数中使用它,但它不起作用(我想我可能犯了一个错误,但在我在类的顶部声明它后,它起了作用) 我在Symfony中看到了这一点,用于设置可以在视图中使用的变量,我在Phorms中也看到了这一点,并举了几个例子 抱歉,如果这是显而易见的,我只想了解如何使用这些变量,包括获取变量的名称(例如$thi
我希望能够在一个函数中设置任何变量名,并在另一个函数中获取任何具有该名称的变量集。例如,在Symfony中,我可以在动作类函数中设置$this->completly\u random\u name=$x,然后在视图中我可以使用$completly\u random\u name。symfony不可能在父类的顶部设置所有可能的变量名组合。类属性默认定义为public,但您不应该这样做。 您应该定义private/protected属性,并定义getter/setter方法,以便在类外部使用它们。事后维修要容易得多
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
}
}
使用公共的getter/setter访问私有变量
编辑
Aistina比我快,他的例子展示了如何访问/检索任何变量名。我不是这方面的专家,但我的OO条件性思维告诉我,无论使用何种语言,不定义类成员变量都是不好的做法 也许您提到的框架在子类中使用了这种模式,其中成员是在超类中定义的 关于第二个问题:您应该看看php的
反射可以帮助您了解类的结构(构造函数、方法、属性)。跳过通常不应该这样做的讨论,您可以使用PHP的magic
\uuuu get
和\uu 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
}
}
为什么你不应该这样做 在我看来,使用magic
\uuu get
和\uu set
函数会导致糟糕的编程实践。让我用一个著名的例子来演示:如果一个杯子是半满的,那么这个杯子是半满的还是半空的?从程序员的角度来看,正确的答案是玻璃太大了。我的意思是,当你添加上面演示的神奇函数时,你可以继续分配变量,这并不重要,但它们是必要的吗
随着时间的推移,您的代码将发生变化,您可能不再需要以前分配的旧变量。通常,您只需删除变量声明,这意味着您的类现在将消耗更少(不需要)的内存。如果你忘了删除一项旧作业,你很快就会发现。有了神奇的函数功能,您将如何跟踪哪些变量是需要的,哪些是不需要的
请记住,编写代码主要是为了让人阅读,其次是为了让机器执行。如果有第二个人加入您的团队,他想知道自己在视图中可以访问哪些变量,那么他要么需要查看分配变量的代码,要么print\r($this->myMagicData)
,而不仅仅是查看类中声明变量的部分
当然,还存在调用神奇函数的开销,这可能是一个问题,也可能不是一个问题,取决于具体情况
总之,手动声明所需的变量有助于:
希望这有帮助 您好,我不想在类的顶部设置变量。我希望能够在一个函数中设置任何变量名,在另一个函数中获取任何具有该名称的变量集。例如,在Symfony中,我可以在函数中设置$this->completly\u random\u name=$x,然后在视图中使用$completly\u random\u name。symfony不可能在父类的顶部设置所有可能的变量名组合。这有意义吗?太好了,艾斯蒂娜,谢谢你。在我开始滥用坏习惯之前,我想先了解一下你为什么不应该这样做。这是一个非常有用的描述,谢谢,如果我只是使用extract()使用神奇的方法为视图设置变量,你会称之为懒惰吗?我不想不声明类变量而逍遥法外,我只是想要更好的代码来为视图设置变量,目前我有一个名为Render::set(array('variable_name'=>$variable')的set函数,但是通过上面的方法,用户/我可以分配变量:$this->variable_name=$variable,这对我来说似乎很好也很整洁。谢谢你的帮助,问候Luke@Luke这不由我来判断,决定权完全在你。我只是说,我个人永远不会使用这个,除非我别无选择。只要记住我上面写的,你可能会没事的。
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
}
}