何时在PHP中使用$ this->属性而不是$ property

时间:2011-12-08 08:51:35

标签: php oop

超级简单的问题。看看2个样本类方法。

在第一个我传入变量/属性调用$params然后我做$this->params

我的问题是,它是否真的需要,我通常这样做,但我注意到它将在第二个示例中工作,只需调用$params而不设置$this

所以我的理论就是这个......如果你需要在该类中使用不同的方法访问该属性,你必须像$this->params那样设置它,如果你只是$params它已经在同一个方法中使用了该属性。

有人可以对此有所了解并解释我的理论是否正确或者我是否离开了我想知道这个的原因所以我会知道什么时候做各种方法或做一个或另一个所有的时间,谢谢你

class TestClass{

    public function TestFunc($params){
       $this->params = $params;

       echo 'testing this something'. $this->params;
    }
}

没有定义变量

class TestClass2{

    public function TestFunc2($params){
       echo 'testing this something'. $params;
    }
}

5 个答案:

答案 0 :(得分:9)

访问类变量时使用$this

当访问实际上是函数中的参数的变量时,不需要使用$this关键字。实际上,要访问名为$ params的函数参数,不应使用$ this关键字。 ..

在你的例子中:

class TestClass{

    public function TestFunc($params){
       $this->params = $params;

       echo 'testing this something'. $this->params;
    }
}
来自$params

TestFunc($params){是函数TestFunc的参数/参数,因此您无需使用$this。实际上,要访问参数的值,您不能使用$this - 现在当您使用$this->params中的$this->params = $params = $params;时,实际上设置的值与的值相同参数 $params到名为的新类级变量 $params(因为您未在示例代码中的任何位置声明它)

[edit]基于评论:

看看这个例子:

class TestClass{

    public function TestFunc($params){
       $this->params = $params;
       # ^ you are setting a new class-level variable $params
       # with the value passed to the function TestFunc 
       # also named $params

       echo 'testing this something'. $this->params;
    }

    public function EchoParameterFromFunction_TestFunc() {
        echo "\n\$this->params: " . $this->params . "\n";
        # now you are echo-ing the class-level variable named $params
        # from which its value was taken from the parameter passed
        # to function TestFunc
    }

}

$tc = new TestClass();
$tc->EchoParameterFromFunction_TestFunc(); # error: undefined property TestClass::$params
$tc->TestFunc('TestFuncParam');
$tc->EchoParameterFromFunction_TestFunc(); # should echo: $this->params: TestFuncParam

在没有先调用EchoParameterFromFunction_TestFunc的情况下调用TestFunc时出现的错误是未声明/设置名为$params的类级别变量/属性的结果 - 您在TestFunc内设置此项{1}},这意味着除非您致电TestFunc,否则不会设置。要正确设置,以便任何人都可以立即访问它:

class TestClass{
    # declare (and set if you like)
    public /*or private or protected*/ $params; // = ''; or create a construct...

    public function __construct(){
        # set (and first declare if you like)
        $this->params = 'default value';
    }
...
...
...

[编辑:附加]

正如 @liquorvicar 所提到的,我也完全同意的是,无论是否使用它们,都应该始终声明所有类级属性/变量。原因是作为一个例子,您不想访问尚未设置的变量。请参阅上面的示例,其中引发了错误undefined property TestClass::$params ..

感谢@liquorvicar提醒我..

答案 1 :(得分:2)

我希望这有助于澄清事情:

class Person {

   private $name;
   private $age;

   public function __construct($name, $age){
     // save func params to instance vars
     $this->name = $name;
     $this->age = $age;
   }

   public function say_hello(){ // look, no func params!
     echo "My name is {$this->name} and I am {$this->age} years old!";
   }

   public function celebrate_birthday(){ // no params again
     echo "Party time!";
     $this->age += 1; // update instance var
     $this->drink_beer();  // call instance method
   }

   public function drink_beer(){
     echo "Beer is good!";
   }
}

$p = new Person("Sample", "20");
$p->say_hello();          // My name is Sample and I am 20 years old!
$p->celebrate_birthday(); // Party time! Beer is good!
$p->say_hello();          // My name is Sample and I am 21 years old!

答案 2 :(得分:1)

通常,当您在对象的上下文(“范围”)中时,可以使用特定变量。

在OOP编程中,$this几乎总是用于访问类变量或其他类方法。

class MyClass{
     private $myNum;

     public function myFunc(){
          echo 'My number is '.$this->myNum; // Outputting the class variable "myNum"
     }

     public function go($myNumber){
          $this->myNum  = $myNumber; // Will set the class variable "$myNum" to the value of "$myNumbe" - a parameter fo the "go" function.
          $this->myFunc(); // Will call the function "myFunc()" on the current object
     }
}

晒。

答案 3 :(得分:1)

您已经自己回答了问题:

  

如果您需要访问它,则必须将其设置为$ this-> params   在该类中使用不同方法的属性,您可以使用just   $ params如果你只是用同样的方法使用那个属性   在已经

答案 4 :(得分:0)

你自己的理论

  

如果您需要在该类中的其他方法中访问该属性,则必须将其设置为$this->params,如果您只是在同一方法中使用该属性,则只能使用$params已经存在了。

是一个很好的指导方针,但它有点短。考虑

public function applyDiscount($discount)
{
    if ($this->isValidDiscountRangeForProduct($discount)) {
        $this->price -= $this->price * $discount;
    }
}

您不会将$discount分配给对象属性,因为您需要在将其应用于$this->price之前对其进行验证(在其他方法中使用)。更好的指导方针是

如果参数仅用于计算对象的内部状态,则不要将其设为属性。

另外,请记住像

这样的方法
public function TestFunc2($params)
{
   echo 'testing this something' . $params;
}

可能放错了该对象,因为它没有内聚。您只希望对象上的方法以某种方式操作此对象的数据。附加不对物体构件操作的方法就像将冰破碎机塞在汽车上一样:

class Car 
{
    public function crushIce($ice)
    {
        // WTF!?
    }
}

更多资源: