Использование __call

green-84

Новичок
Использование __call

Страничка следующего содержания:

PHP:
<?php


class Page {
  static function __call($className, $classParam) {
    return new $className($classParam);
  }
  
  static public function Show() {
    echo "<p>Page Content</p>";
  }

}

class BlockContent {
  public function Show() {
    echo "<p>Block Content</p>";
  }
}


Page::Show();
Page::BlockContent()->Show();


?>
выдает:

PHP:
Page Content

Fatal error: Call to undefined method Page::blockcontent() in test-2.php on line 23

Т.е. получается нельзя использовать класс Page без создания объекта для того, чтобы в нем использовался метод __call...
Есть ли у кого какие-либо мысли по этому поводу? )
 

green-84

Новичок
Заковырка в том, чтобы этого не делать по неопределенным причинам. Хочется разврата...
 

green-84

Новичок
Автор оригинала: zerkms
green-84
как видишь - разврата не будет
Жаль. Ведь это очень даже эротично - Page::BlockContent()->Show();
Можно в любом методе любого класса создать таким макаром объект предварительно заинклуденного класса и сразу же воспользоваться его методом (Show в данном случае).
Есть, конечно, и другие варианты - но этот (если бы работал) был бы очень симпотичным. )

P.S.
Может кто-нибудь обоснует почему не вызывается __call в данном случае? )
 

Gorynych

Посетитель PHP-Клуба
__call не вызывается, потому что вызов написан как обращение к статическому методу класса. Ваш код будет работать, если изменить его так:
PHP:
$p = new Page();
$p->BlockContent()->Show();
 

green-84

Новичок
Автор оригинала: Gorynych
__call не вызывается, потому что вызов написан как обращение к статическому методу класса. Ваш код будет работать, если изменить его так:
PHP:
$p = new Page();
$p->BlockContent()->Show();
Это понятно, что он будет так работать. Непонятно только почему при обращении к несуществующему статическому методу "BlockContent" класса "Page" не вызывается метод "__call".
Видимо, не получиться никак реализовать этот механизм Page::BlockContent()->Show() ... [:)
 

green-84

Новичок
Автор оригинала: mishco
зато получится
Page::getInstance()->BlockContent()->Show()
PHP:
<?php


class Page {

  private static $Handler = null;

  private function __construct() {}
  private function __clone() {}

  static public function __call($className, $classParam) {
    return new $className($classParam);
  }
  
  public function Show() {
    echo "<p>Page Content</p>";
  }

  static function getInstance() {
    if(self::$Handler == null) self::$Handler = new Page();
    return self::$Handler;
  }

}

class BlockContent {
  public function Show() {
    echo "<p>Block Content</p>";
  }
}

Page::getInstance()->Show();
Page::getInstance()->BlockContent()->Show();


?>
Да, это действительно работает. Спасибо, mishco - я совсем забыл про инстансер.
 
Сверху