2009-12-24 39 views
18

Tôi có lớp sau trong PHPLàm thế nào để truy cập vào một thành viên tin bên trong một hàm tĩnh trong PHP

class MyClass 
{ 
    // How to declare MyMember here? It needs to be private 
    public static function MyFunction() 
    { 
    // How to access MyMember here? 
    } 
} 

Tôi hoàn toàn bối rối về những cú pháp để sử dụng

$MyMember = 0;echo $MyMember

hoặc

private $MyMember = 0;echo $MyMember

hoặc

$this->MyMember = 0;echo $this->MyMember

Có thể ai đó cho tôi biết làm thế nào để làm điều đó?

Tôi không mạnh trong OOPS.

Bạn có thể làm điều đó ngay từ đầu không?

Nếu không, làm cách nào để khai báo thành viên để tôi có thể truy cập vào bên trong các hàm tĩnh?

+0

liên quan: [? có thể tĩnh thành viên sử dụng các thành viên không tĩnh và ngược lại] (http://stackoverflow.com/q/2204128/367456) – hakre

Trả lời

54
class MyClass 
{ 
    private static $MyMember = 99; 

    public static function MyFunction() 
    { 
    echo self::$MyMember; 
    } 
} 

MyClass::MyFunction(); 

thấy VisibilityScope Resolution Operator (::) trong chương oop5 của cuốn cẩm nang php.

+0

1 - Tôi đã không biết về tự khóa . mã của bạn đã hoạt động! thanks :) –

1

Trong các phương thức tĩnh, bạn không thể gọi biến bằng cách sử dụng $this vì các phương thức tĩnh được gọi bên ngoài "ngữ cảnh cá thể".

Được ghi rõ trong PHP doc.

1
<?php 
    class MyClass 
    { 
     // A) 
     // private $MyMember = 0; 

     // B) 
     private static $MyMember = 0; 

     public static function MyFunction() 
     { 
      // using A) // Fatal error: Access to undeclared static property: 
      //    MyClass::$MyMember 
      // echo MyClass::$MyMember; 

      // using A) // Fatal error: Using $this when not in object context 
      // echo $this->MyMember; 

      // using A) or B) 
      // echo $MyMember; // local scope 

      // correct, B) 
      echo MyClass::$MyMember; 
     } 
    } 

    $m = new MyClass; 
    echo $m->MyFunction(); 
    // or better ... 
    MyClass::MyFunction(); 

?> 
+0

Bạn có thể gọi '$ m-> MyFunction();' như vậy nếu hàm tĩnh? –

+0

có bạn có thể, nhưng có lẽ bạn không nên vì nó che khuất thực tế, rằng chức năng là đối tượng ràng buộc .. – miku

+0

Lạ. Tôi nghĩ rằng bạn chỉ có thể gọi các chức năng tĩnh của ClassName :: FunctionName và không phải bằng cách instantiating. Dù sao, tôi có nghi ngờ này -> Nếu bạn khai báo các biến như trong trường hợp A) và sử dụng nó như 'echo $ MyMember', nó không làm việc cho tôi. Nó không hoạt động đúng không? Tôi không thể hiểu nhận xét của bạn - '// local' ở đó. –

6

Đây là một phản ứng siêu chậm nhưng nó có thể giúp một người nào đó ..

class MyClass 
{ 
    private $MyMember; 

    public static function MyFunction($class) 
    { 
    $class->MyMember = 0; 
    } 
} 

đó làm việc. Bạn có thể truy cập vào private member theo cách đó, nhưng nếu bạn có $ class, bạn chỉ cần làm cho MyFunction một phương thức của lớp, vì bạn chỉ cần gọi $ class-> MyFunction(). Tuy nhiên, bạn có thể có một mảng tĩnh mà mỗi cá thể được thêm vào trong hàm tạo lớp mà hàm tĩnh này có thể truy cập và lặp qua, cập nhật tất cả các cá thể. tức là ..

class MyClass 
{ 
    private $MyMember; 
    private static $MyClasses; 

    public function __construct() 
    { 
    MyClass::$MyClasses[] = $this; 
    } 

    public static function MyFunction() 
    { 
    foreach(MyClass::$MyClasses as $class) 
    { 
     $class->MyMember = 0; 
    } 
    } 
} 
Các vấn đề liên quan