当使用$这 - >属性,而不是在PHP $财产当使用$这 - >属性,而不是在PHP $

2019-05-12 06:52发布

超级简单的问题。 看看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;
    }
}

Answer 1:

使用$this访问类变量时。

当访问一个变量,它实际上是在一个函数的参数,没有必要利用$this关键字..其实,要访问一个名为$ PARAMS功能参数,你不应该使用$ this关键字...

在您的例子:

class TestClass{

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

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

$paramsTestFunc($params){是函数的参数/参数TestFunc ,所以你不需要使用$this 。 事实上,进入参数的值,你不能使用$this -现在,当你使用$this->params$this->params = $params = $params; ,你是一个值相当于实际设置该参数$params 任命了新的类级变量$params (因为你没有在你的示例代码中任何位置声明它)

[编辑]基于评论:

请看下面的例子:

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 ,这意味着它不会设置,除非你叫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提醒我..



Answer 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!


Answer 3:

一般来说,当他们在你的对象的上下文(“范围”),可以使用特定的变量。

在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
     }
}

夏嘉曦。



Answer 4:

你已经回答了你的问题,你自己:

你必须把它像$这个 - > PARAMS如果您需要访问该属性在不同的方法在该类中,你可以,如果你只使用它在已同方法财产只使用$ PARAMS



Answer 5:

你自己的理论

你必须设置它像$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!?
    }
}

更多资源:

  • https://en.wikipedia.org/wiki/Law_of_Demeter
  • https://en.wikipedia.org/wiki/GRASP_%28object-oriented_design%29
  • https://en.wikipedia.org/wiki/Solid_%28object-oriented_design%29


文章来源: When to use $this->property instead of $property in PHP
标签: php oop