2014-02-13 2 views
-1

Можно ли просто заставить методы работать как с статическими вызовами, так и с вызовами объектов-экземпляров.

Например:

class MyClass { 
    private static $instance = null; 
    private $my_value = 'Foo'; 

    public function __construct() { 
     self::$instance = new self; 
    } 

    public static function my_function() { 
     if(isset($this)) { 
      $target = $this->; // I know its an invalid declaration 
     } else { 
      $target = self::$instance->; // I know its an invalid declaration 
     } 
     return $target $my_value; // Invalid statement 
    } 
} 

$my_object = new My_Class(); 
echo $my_object->my_function(); // Should output Foo 
echo My_Class::my_function(); // Should output Foo 

Надежда это ясно

+2

... почему бы вам когда-нибудь хочет? –

+0

Причина в том, что я хотел посмотреть, могу ли я сделать объект singleton возвращать тот же результат независимо от того, был ли метод вызван статически или из экземпляра. – McShaman

+1

Ну, одноэлемент, по определению, является * объектом *, который создается статически, с некоторыми конструкторскими shenanigans, чтобы гарантировать, что только один существует в любой момент времени. Поскольку это объект, вы должны рассматривать его как единое целое. Конечно, возникает вопрос, почему вы пытаетесь использовать одноэлемент в среде, которая обычно имеет жизненный цикл одного запроса? И передает объекты по ссылке по умолчанию? Я считаю, что одиночные игры не нужны в PHP. Вместо этого используйте инъекцию зависимостей. Это более чистый способ решения проблемы, которая не раздувает сферу действия. –

ответ

2

Нет, это не вариант.

Способы являются либо статическими, либо нестационарными.

[Как упомянуто kingkero, вы на самом деле можете. Но PHP сообщает об ошибке. Поэтому я написал, что вы не можете. Читайте: вы никогда не хотите!]

И я не могу представить ситуацию, почему нужно вызвать метод, используя self:: и $this->.

Вы, вероятно, хотите реализовать шаблон одного экземпляра объяснен here:

class CSampleClass 
{ 
    private static $instance; 
    private $count = 0; 

    private function __construct() 
    { 
    } 

    public static function singleton() 
    { 
     if (!isset(self::$instance)) { 

      self::$instance = new CSampleClass(); 
     } 
     return self::$instance; 
    } 

    public function increment() 
    { 
     return $this->count++; 
    } 

    public function __clone() 
    { 
     trigger_error('Failed to create the clone', E_USER_ERROR); 
    } 

    public function __wakeup() 
    { 
     trigger_error('Sorry, ' . __CLASS__ . ' can"t be deserialized' , E_USER_ERROR); 
    } 
} 
+0

На самом деле вы можете вызвать статические методы в нестационарном контексте (и наоборот) - хотя это не изменит первоначальное поведение и вызовет ошибку/уведомление. В PHP есть некоторая информация об этом поведении – kero

+0

@kingkero Да, вы можете. И вы можете прыгать с 50-метрового моста. На самом деле, вы не будете - и я не буду предлагать ;-) Кроме того, PHP, возможно, в конечном итоге запретит звонить .. – SteAp

+0

Спасибо, что нашли время ответить – McShaman

Смежные вопросы