Когда использовать $ this-> свойство вместо $ property в PHP

Супер простой вопрос. Посмотрите на 2 класса методов класса.

В первом я $params вызов переменной / свойства $params I, затем выполните $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; } } 

Используйте $this при доступе к переменным класса.

При доступе к переменной, которая на самом деле является параметром в функции, нет необходимости использовать ключевое слово $this . Фактически для доступа к параметру функции с параметрами $ params вам не следует использовать $ this keyword …

В вашем примере:

 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 (поскольку вы не объявляли ее нигде в вашем примере кода)

[править] на основе комментария:

Посмотрите на этот пример:

 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'; } ... ... ... 

[edit: дополнительные]

Как упоминал @liquorvicar , с которым я также полностью согласен, вы должны всегда объявлять все свои свойства / переменные на уровне класса независимо от того, будете ли вы их использовать. Причина состоит в том, что вы не хотите получать доступ к переменной, которая не была установлена. См. Мой пример выше, который undefined property TestClass::$params ошибку undefined property TestClass::$params ..

Спасибо @liquorvicar за то, что напомнили мне.

Надеюсь, это поможет разобраться в этом:

 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! 

В общем, вы можете использовать определенную переменную, когда они находятся в контексте («область») вашего объекта.

В программировании ООП $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 } } 

Шай.

Вы уже сами ответили на свой вопрос:

Вы должны установить его как $ this-> params, если вам нужно получить доступ к этому свойству другим методом в этом классе, и вы можете использовать только $ params, если вы используете это свойство только в том же методе, в котором он уже находится

Ваша собственная теория

Вы должны установить его как $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!? } } 

Дополнительные ресурсы: