2012-12-20 12 views
6

Jestem nowy w PHP i ćwiczę używając zmiennych statycznych. Postanowiłem pobrać przykład, który nauczyłem się z C++ i ponownie napisałem dla PHP (przykład z dołu this article).przypisywanie statycznego var do niestatycznego var, metoda zwracania wartości niedziałających

Istnieje klasa z dwiema zmiennymi prywatnymi (jedna statyczna), konstruktorem i metodą get. Konstruktor przypisuje wartość zmiennej statycznej do drugiej zmiennej prywatnej, a następnie inkrementuje.

<?php 
class Something 
{ 
    private static $s_nIDGenerator = 1; 
    private $m_nID; 

    public function Something() { 
     $m_nID = self::$s_nIDGenerator++; 
     echo "m_nID: " . $m_nID . "</br>"; //for testing, can comment this out 
    } 
    public function GetID() { 
     return $m_nID; 
    } 

} 

// extra question: 
// static variable can be assigned a value outside the class in C++, why not in PHP? 
// Something::$s_nIDGenerator = 1; 

    $cFirst = new Something(); 
    $cSecond = new Something(); 
    $cThird = new Something(); 

    echo $cFirst->GetID() . "</br>"; 
    echo $cSecond->GetID() . "</br>"; 
    echo $cThird->GetID() . "</br>"; 
?> 

Korzystanie z echa testu w linii 9, aby zobaczyć czy m_nID jest uzyskanie wartości widać:

m_nID: 1 
m_nID: 2 
m_nID: 3 

Ale te wartości są nie zwracane przez „-> getId()” połączenia. Jakieś pomysły, dlaczego?

Edytuj: obie odpowiedzi do tej pory rozwiązały to, chciałbym móc "sprawdzić" je obie, więc dziękuję! Zostawię oryginalny kod w pytaniu, tak jak jest dla przyszłych ludzi, którzy mają podobny problem.

Odpowiedz

9

Twoje pochodzenie w C++ doprowadziło do tego problemu, co łatwo popełnić. W PHP wszystkie zmienne instancji (lub obiektów) są przywoływane za pomocą $this->, a zmienne statyczne (lub klasy) z self::. W oparciu o kodzie:

public function GetID() { 
    return $m_nID; 
} 

Dostęp do prywatnej zmiennej $m_nID powinna być zawężona tak:

public function GetID() { 
    return $this->m_nID; 
} 

A wewnątrz konstruktora:

$m_nID = self::$s_nIDGenerator++; 

powinno to być:

$this->m_nID = self::$s_nIDGenerator++; 

Q &

Dlaczego nie ma potrzeby umieszczania $ przed m_nID podczas korzystania $this->

Powyższe dwa sposoby odwoływania instancji i klasa zmienne pochodzą z zupełnie innego rodzaju składni:

  1. $this jest zmienna referencję i wszystkie właściwości są wg essed za pomocą operatora ->; numer $ nie jest powtarzany dla samych nazw właściwości, mimo że są one obecne w deklaracji (np. private $myprop).

  2. self:: jest synonimem Something:: (sama nazwa klasy); nie odnosi się do zmiennej instancji i dlatego nie ma przed nią żadnej innej instancji. Aby odróżnić zmienne statyczne od stałych klas (self::MYCONST) i metod klas (self::myMethod()), jest on poprzedzany prefiksem $.

Extra

Powiedział, $this->$myvar zostanie przyjęty zbyt i działa tak:

private $foo = 'hello world'; 

function test() 
{ 
    $myvar = 'foo'; 
    echo $this->$foo; // echoes 'hello world' 
} 
+0

@tempe Ugh, zapomniałem o innym odnośniku również było źle = ( –

+0

Sprawdziłem powyższą odpowiedź Mr. Cook'a, gdzie zasugerował użycie '$ this->' w konstruktorze oraz metodę get, która działała --- ale dziękuję za twoją pomoc! i tak, gdy jestem świadomy 'tego' w C++, stwierdzam, że potrzebuję go użyć więcej nauki PHP – tempcode

+0

@tempe Tak, to jest w mojej zaktualizowanej odpowiedzi pod ** Update **. –

2
class Something{ 
    private static $s_nIDGenerator = 1; 
    private $m_nID; 

    public function Something() { 
     $this->m_nID = self::$s_nIDGenerator++; 
    } 
    public function GetID() { 
     return $this->m_nID; 
    } 

} 

Warto zwrócić uwagę na różnicę pomiędzy użyciem self::$s_nIDGenerator o zmiennej statycznej vs używanie $this->s_nIDGenerator na zmiennej statycznej, natomiast $this-> niczego nie przechowuje.

+0

dziękuję za odpowiedź, jednak użycie '$ this->' prowadzi do błędu, który brzmi: 'Nie można uzyskać dostępu do pustej właściwości' --- co wydaje się sugerować, że '$ m_nID' jest puste, gdy wiem, że nie powinno być (jak pokazano w moim teście echo na linii 9) – tempcode

+0

która linia mówi" Nie mogę uzyskać dostępu do pustej właściwości ", właśnie przetestowałem i nie otrzymał żadnych błędów. –

+0

ahhh nevermind Przypadkowo zachowałem "$" obok obu m_nID (tj. '$ This -> $ m_nID'), co spowodowało pojawienie się błędu, używając twojego kodu działa - dziękuję! – tempcode