2010-01-13 26 views
5

Tuyên bố từ chối trách nhiệm: Có, tôi bị buộc phải hỗ trợ PHP 4.3.0. Tôi biết nó đã chết. Không, tôi không thể nâng cấp nó, bởi vì tôi đang giao dịch với nhiều máy chủ mà một số máy chủ không truy cập được.Sử dụng các thuộc tính tĩnh trong PHP> = 4.3.0?

Vâng, vì tôi không thể sử dụng self:: vì nó là PHP5 cụ thể, tôi nên thực hiện các thống kê trong lớp PHP4 như thế nào? Cho đến nay từ nghiên cứu của tôi có vẻ như tôi ít nhất có thể sử dụng từ khóa static ngoại trừ trong ngữ cảnh chức năng, tôi đã thấy một phương pháp khác sử dụng $ _GLOBALS nhưng tôi không nghĩ mình sẽ sử dụng nó.

Để chúng tôi đang ở trên cùng một trang tôi cần phải truy cập vào các tĩnh học PHP5 trong 4:

public static $_monthTable = array(
    31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); 
public static $_yearTable = array(
    1970 => 0,   1960 => -315619200); 

Cho đến nay, tôi đã đi lên với chức năng của riêng tôi mà về cơ bản đặt ra một biến tĩnh nếu một không tìm thấy, và tôi mã hóa tất cả các thuộc tính tĩnh của tôi vào nó. Tuy nhiên, tôi không hoàn toàn chắc chắn làm thế nào tôi có thể tham khảo những thống kê trong phương pháp anther trong cùng một lớp, giả sử nó không được instantiated và không có constructor được bắn, có nghĩa là tôi không thể sử dụng $this.

class DateClass { 

    function statics($name = null) { 

     static $statics = array(); 

     if (count($statics) == 0) { 
      $statics['months'] = array(
       'Jan', 'Feb' 
      ); 
     } 

     if ($name != null && array_key_exists($name, $statics)) { 
      return $statics[$name]; 
     } 
    } 

}; 

var_dump(DateClass::statics('months')); 

Câu hỏi # 1: Điều này có khả thi không? Tôi có nên thử sử dụng một phương pháp khác không?

Câu hỏi # 2: Tôi làm cách nào để tham khảo các thống kê từ một phương thức trong cùng một lớp? Tôi đã cố gắng __CLASS__::statics nhưng tôi nghĩ rằng __CLASS__ chỉ là một chuỗi vì vậy tôi không thực sự gọi một phương pháp.

Lưu ý: Tôi sẽ triển khai tính năng này thành một khung sẽ được sử dụng trên Apache2 +/IIS6 +, PHP4.3.0 đến PHP 5.2, OSX/Linux/Windows.

+1

Tôi cảm thấy nỗi đau của bạn :(Có lần tôi đã phải làm việc ở một nơi mà sử dụng mà cùng một phiên bản php và tôi không thể làm bất cứ điều gì về nó tôi. Tôi rất vui vì tôi không còn ở đó nữa :) Chúc bạn may mắn !! – AntonioCS

Trả lời

4

Trả lời câu hỏi đầu tiên của bạn, tôi nghĩ giải pháp của bạn là tốt. Tôi sẽ mở rộng nó để các biến cũng có thể được thiết lập và bỏ đặt định. Tôi cũng sẽ "đánh dấu" các số liệu thống kê tĩnh tĩnh khác nhau, giá trị của các biến chưa đặt mặc định là null.

<?php 
class DateClass { 
    function statics($name, $value=null, $unset=null) { 
    static $statics; 
    // better way to "prime" $statics, it's null by default 
    if (!$statics) { 
     $statics = array("months" => array("Jan", "Feb")); 
    } 
    if ($value) 
     $statics[ $name ] = $value; 
    if ($unset) 
     unset($statics[ $name ]); 
    // don't worry about checking for existence 
    // values of unset variables and array keys always are null 
    // that's what you should return 
    return $statics[ $name ]; 
    } 
} 

Về câu hỏi thứ hai của bạn, bạn có thể sử dụng bất cứ nơi nào DateClass::statics(), thậm chí bên trong các phương pháp khác (tĩnh hay không) của DateClass. PHP4 cũng cho phép bạn gọi DateClass::statics() làm phương thức thể hiện mặc dù bạn không nên làm điều đó. (Nó cũng có thể gọi phương pháp dụ tĩnh, miễn là có $ này trong phạm vi bên ngoài.Đó là không đẹp và bạn chắc chắn không nên làm điều đó ;-)

Nếu bạn thực sự muốn gọi đến DateClass trở nên năng động hơn, bạn có thể sử dụng call_user_func, nó chỉ dài hơn một chút.

<?php 
class DateClass { 
    function statics(...) { ... } 
    function anotherStaticFunc() { 
    var_dump(DateClass::statics('months')); 
    // using __CLASS__ and call_user_func 
    var_dump(
     call_user_func(array(__CLASS__, 'statics'), 'months') 
    ); 
    } 
    function instanceMethod() { 
    var_dump($this->statics('months')); 
    } 
} 
2

Nói chung là một ý tưởng tồi để mô phỏng các tính năng ngôn ngữ. Vì PHP 4 không hỗ trợ các thuộc tính tĩnh, tôi sẽ không khuyên bạn nên thử một cái gì đó thông minh để làm cho nó xuất hiện như-nếu. Tôi muốn nói rằng điều tự nhiên nhất là sử dụng các biến toàn cục. Về cơ bản, đó là những gì một tài sản tĩnh anyway - Nó chỉ là không gian tên. Vì vậy, sử dụng một quy ước không gian tên, để giảm thiểu nguy cơ bị tịch thu và bạn về cơ bản sẽ có cùng một thứ. Ví dụ.thay vì:

class Foo { 
    static $ninja = 42; 
} 

Bạn có thể sử dụng

$GLOBALS['foo_ninja'] = 42; 
Các vấn đề liên quan