Супер простой вопрос. Посмотрите на 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!? } }
Дополнительные ресурсы: