Php 在类函数中设置变量,在哪里可以使用该变量

Php 在类函数中设置变量,在哪里可以使用该变量,php,class,class-variables,Php,Class,Class Variables,如果我有一个类(如下所示),并且在一个函数中设置了一个变量(如下:$this->example),但是我没有在类的顶部声明变量(例如var$example;),在哪里以及如何使用这个变量?我试着直接在另一个函数中使用它,但它不起作用(我想我可能犯了一个错误,但在我在类的顶部声明它后,它起了作用) 我在Symfony中看到了这一点,用于设置可以在视图中使用的变量,我在Phorms中也看到了这一点,并举了几个例子 抱歉,如果这是显而易见的,我只想了解如何使用这些变量,包括获取变量的名称(例如$thi

如果我有一个类(如下所示),并且在一个函数中设置了一个变量(如下:$this->example),但是我没有在类的顶部声明变量(例如var$example;),在哪里以及如何使用这个变量?我试着直接在另一个函数中使用它,但它不起作用(我想我可能犯了一个错误,但在我在类的顶部声明它后,它起了作用)

我在Symfony中看到了这一点,用于设置可以在视图中使用的变量,我在Phorms中也看到了这一点,并举了几个例子

抱歉,如果这是显而易见的,我只想了解如何使用这些变量,包括获取变量的名称(例如$this->example,我所说的名称是“example”)

任何帮助都将不胜感激

问候

卢克

编辑:(摘自我对巨像博士的回复)


我希望能够在一个函数中设置任何变量名,并在另一个函数中获取任何具有该名称的变量集。例如,在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
      }
    }