Tôi đang làm việc trên một lớp cần truy cập thông qua các cuộc gọi hàm tĩnh cũng như các phương thức đối tượng. Một điều tôi đã tìm thấy là tôi đang nhân đôi logic trên nhiều chức năng.
Giản dụ:
class Configurable{
protected $configurations = array();
protected static $static_configurations = array();
public function configure($name, $value){
// ...lots of validation logic...
$this->configurations[$name] = $value;
}
public static function static_configure($name, $value){
// ...lots of validation logic (repeated)...
self::$static_configurations[$name] = $value;
}
}
Tôi đã tìm thấy một giải pháp cho điều này, nhưng nó cảm thấy thực sự bẩn:
class Configurable{
protected $configurations = array();
protected static $static_configurations = array();
public function configure($name, $value){
// ...lots of validation logic...
if (isset($this)){
$this->configurations[$name] = $value;
}
else{
self::$static_configurations[$name] = $value;
}
}
}
tôi cần những chức năng tĩnh cũng vì vậy mà tôi có thể thiết lập cấu hình trong suốt ứng dụng. Ngoài ra, điều tốt đẹp với kỹ thuật này là tôi có thể sử dụng cùng một tên phương thức trong cả hai phạm vi.
Có vấn đề gì với phạm vi kiểm tra như thế này không? Các vấn đề về hiệu năng, các vấn đề tương thích về phía trước, vv Tất cả đều hoạt động với tôi trên PHP 5.2 và tôi không cần hỗ trợ < 5.
OK, ngoài lỗi nghiêm ngặt, có bất kỳ vấn đề nào với phương pháp thứ hai không? Tôi có lẽ sẽ thay đổi nó trên lời khuyên của bạn anyway, nhưng tôi muốn hiểu những vấn đề thực sự với việc sử dụng mã như thế này. Đây có phải là một tính năng có khả năng bị xóa khỏi các phiên bản PHP trong tương lai hay bạn sẽ luôn có thể gọi các phương thức tĩnh không phải là tĩnh? – Rowan
Lỗi 'E_STRICT' có xu hướng là" Điều này có vẻ như một ý tưởng thực sự tồi tệ, nhưng chúng tôi sẽ cho phép bạn cố gắng làm điều đó. " Không có gì đảm bảo rằng một thứ như vậy sẽ luôn hoạt động, nhưng chúng có thể sẽ được chuyển thành 'E_NOTICE' hoặc' E_WARN' trước khi hoàn toàn không được chấp nhận nữa. – MightyE
Cảm ơn bạn đã làm rõ @MightyE – Rowan