超级简单的问题。 看看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;
}
}
使用$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
(因为你没有在你的示例代码中任何位置声明它)
[编辑]基于评论:
请看下面的例子:
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提醒我..
我希望这将有助于明确的东西:
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!
一般来说,当他们在你的对象的上下文(“范围”),可以使用特定的变量。
在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
}
}
夏嘉曦。
你已经回答了你的问题,你自己:
你必须把它像$这个 - > 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!?
}
}
更多资源:
- 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