2011-12-08 61 views
4

超簡單的問題。看看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; 
    } 
} 
+0

你在第一個函數中做的是讀取ge的參數傳遞給函數,並將它們保存到類變量中。如果在示例中使用它是沒有意義的,但如果要存儲變量,那麼這就是「設置函數」如何工作的原因 – Flo

回答

8

使用$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 = $params = $params;使用$this->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 

沒有首先調用TestFunc時調用EchoParameterFromFunction_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提醒我..

+0

因此,如果在另一個函數中需要函數參數,那麼我將不得不使用$ this - > $ param對不對? – JasonDavis

+0

是的。讓我修改我的代碼給你一個例子 – Nonym

+0

如果你使用$ this-> var,那麼你可以在同一個類的所有方法中訪問這個變量(比如這個類中的「global」)。 – djot

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

Shai。

1

你已經回答了你的問題你自己:

你必須設置它像$這個 - > PARAMS如果你需要訪問 財產在不同的方法在類,你可以只使用 $ PARAMS如果你只使用在相同的方法屬性是 在已經

0

你自己的理論

如果您需要使用該類中的另一種方法訪問該屬性,並且只使用$params(如果您只使用該屬性的方法與已有方法相同),則必須將其設置爲$this->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!? 
    } 
} 

更多資源:

相關問題