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

时间:2010-06-24 09:15:12

标签: php class class-variables

如果我有一个类(如下所示)并且在函数中我设置了一个变量(下面:$ 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无法在父类的顶部设置变量名的所有可能组合。

4 个答案:

答案 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.   
  3. 让您和其他人更容易阅读您的代码
  4.   
  5. 执行得更快
  6. 希望这有帮助!

答案 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帮助您了解类的结构(构造函数,方法,属性)。