2011-01-17 30 views
46

Tôi hơi bối rối với vấn đề này. Tôi đang thiết kế một lớp ORM cố gắng cư xử rất giống với ActiveRecord trong ruby ​​trên đường ray, nhưng điều đó nằm ngoài vấn đề.PHP Có thể tĩnh :: thay thế tự ::?

Điều tôi đang cố gắng nói là lớp của tôi sử dụng rộng rãi tính kế thừa thuộc tính tĩnh, đặc biệt cho cơ sở dữ liệu và xử lý bảng. Câu hỏi của tôi là, tôi có nên tự sử dụng :: không?

+0

Tôi nghĩ 'static' là cách tiếp cận sai lầm ngay từ đầu. Nó có vẻ như (và xin vui lòng sửa nếu sai) bạn chỉ cần thực hiện mã của bạn untestable. – PeeHaa

Trả lời

94

Bạn phải tự hỏi mình: "Tôi có đang nhắm mục tiêu vấn đề với cách tiếp cận đầy đủ không?"

self::static:: làm hai việc khác nhau. Ví dụ: self:: hoặc __CLASS__ là tham chiếu đến lớp hiện tại, do đó được xác định trong phạm vi nhất định, nó sẽ KHÔNG đáp ứng nhu cầu gọi tĩnh về phía trước.

Điều gì sẽ xảy ra trên di sản?

class A { 
    public static function className(){ 
     echo __CLASS__; 
    } 

    public static function test(){ 
     self::className(); 
    } 
} 

class B extends A{ 
    public static function className(){ 
     echo __CLASS__; 
    } 
} 

B::test(); 

này sẽ in

A 

Mặt khác với static:: Nó có hành vi mong đợi

class A { 
    public static function className(){ 
     echo __CLASS__; 
    } 

    public static function test(){ 
     static::className(); 
    } 
} 

class B extends A{ 
    public static function className(){ 
     echo __CLASS__; 
    } 
} 


B::test(); 

này sẽ in

B 

đó được gọi là late static binding in PHP 5.3.0. Nó giải quyết giới hạn gọi lớp là được tham chiếu tại thời gian chạy.

Với ý nghĩ đó, tôi nghĩ giờ đây bạn có thể xem và giải quyết vấn đề một cách đầy đủ. Nếu bạn đang thừa hưởng một số thành viên tĩnh và cần quyền truy cập vào phụ huynh và các thành viên con self:: sẽ không đủ.

+8

Vì vậy, về cơ bản nếu tôi muốn mọi thứ hoạt động như bình thường, như trong mọi ngôn ngữ khác, tôi nên sử dụng tĩnh thay vào đó? Và sau đó khi những điều như vậy không thực sự quan trọng tôi cũng có thể sử dụng tự cho khả năng tương thích. Đúng không? – elite5472

+7

Đúng vậy, nếu bạn muốn tương thích ngược, bạn sẽ phải đối phó với bản thân. Nếu bạn muốn truy cập các thành viên tĩnh theo cách đó bạn sẽ phải thực hiện một phương thức tĩnh kết thúc tốt đẹp các thành viên. – DarkThrone

+0

được rồi, cảm ơn vì đã dọn dẹp mọi thứ cho tôi. – elite5472

6

cố gắng sử dụng mã dưới đây để thấy sự khác biệt giữa tựtĩnh:

<?php 
class Parent_{ 
    protected static $x = "parent"; 
    public static function makeTest(){ 
     echo "self => ".self::$x."<br>"; 
     echo "static => ".static::$x;  
    } 
} 

class Child_ extends Parent_{ 
    protected static $x = "child"; 
} 

echo "<h4>using the Parent_ class</h4>"; 
Parent_::makeTest(); 

echo "<br><h4>using the Child_ class</h4>"; 
Child_::makeTest(); 
?> 

và bạn sẽ có được kết quả này:

sử dụng lớp PARENT_

  • tự => mẹ
  • tĩnh => mẹ

sử dụng lớp Child_

  • tự => mẹ
  • tĩnh => con
Các vấn đề liên quan