2014-09-27 4 views
0

Я нашел способ сделать следующий вызов с помощью динамических методов в PHP (вход и IMG только пример, это может создать что-нибудь):Динамические методы в PHP

$Form->insert->input(array('type' => 'text', 'name' => 'firstName', 'maxlength' => '100', 'value' => 'First name')) 
$Form->insert->img(array('id' => 'banner', 'src' => '/images/banner.svg')) 

Этот трюк использует два объекта (форма и FormInsert). И вставка формы использует метод _call, что означает, что я мог бы создать любой объект HTML с помощью этого метода.

В то время как это работает хорошо, мне было интересно, если есть способ использовать следующий, лучше синтаксис вместо ?:

$Form->insert->input->type('text')->name('firstName')->maxlength('100')->value('First name') 
$Form->insert->img->id('banner')->src('/images/banner.svg') 

Идея заключается в том, чтобы создать не только входы, но какой-либо HTML-элемента.

ответ

1

Что вы спросите является обычной практикой в ​​JQuery и вы, конечно, можете сделать это в PHP, все, что вам нужно сделать, это вернуть объект каждый раз, когда:

class FormInsert 
{ 
    ... 

    public function __call($method, $args) 
    { 
     // do the cool stuff 

     return $this; 
    } 
    ... 
} 

Таким образом, вы будете возвращаться к объект FomrInput, чтобы добавить сведения о теге, который вы строите.


Идея звучит интересно. Я вижу несколько проблем, хотя, если вы ограничиваете себя только двумя классами. Мне кажется, что класс FormInsert будет огромным и полным элементов управления для рассмотрения конкретных случаев и «синтаксиса HTML-тегов».

Если я думаю о способах решения этих проблем, я получаю класс для каждого HTML-тега и не нуждаюсь в магическом методе __call() ... опять же, я не так глубоко погрузился в проблему.

+0

Глядя здорово! Можете ли вы представить полный пример? По некоторым причинам я пытаюсь реализовать это, и я получаю некоторые нечетные ошибки ... –

+0

@nbouvrette Какие ошибки? – wavemode

+0

Уведомление: Неопределенное свойство: FormInsert :: $ input в C: \ htdocs \ index.php в строке 48 Неустранимая ошибка: вызовите функцию-функцию участника() для не-объекта в C: \ htdocs \ index.php в строке 48 –

0

Это может быть полезно для других, но мне удалось получить следующие 3 класса, которые могут помочь семантически создавать объекты HTML в PHP при отслеживании некоторой информации, которая может быть повторно использована на PHP (например, идентификаторы внутри объекта или «имена» внутри форма). Следующий объект предназначен для формы, но может быть использован и для объекта body.

class ElementAttribute { 

    protected $parent; // Parent class object 

    function __construct(&$parent, $element) { 
     $this->parent = &$parent; 

     $this->rootElement = &$this->parent; 
     if (@is_object($this->rootElement->parent)) { 
      $this->rootElement = &$this->rootElement->parent; // Set root element 
     } 
     $this->rootClassName = strtolower(get_class($this->rootElement)); // Set root class name object 
     $this->element = $element; // Define current HTML element 
     $this->s = '<'.$this->element; // Initialize HTML string 
    } 

    public function __call($method, $args) { 

     $method = strtolower($method); // User lowercase by convention for HTML5 

     if (isset($args[0])) { 
      // Add available attributes to root element when created 
      if ($this->element == $this->rootClassName) { 
       if (@property_exists($this->rootElement, $method)) { 
        $this->rootElement->$method = $args[0]; 
       } 
      } 
      // Add available attribute arrays to root element when created 
      $a = $method.'s'; 
      if (@property_exists($this->rootElement, $a)) { 
       array_push($this->rootElement->$a, $args[0]); 
      } 
      $this->s .= ' '.$method.'="'.$args[0].'"'; 
     } 
     return $this; 
    } 

    public function __toString() { 
     $s = $this->s.'>'; 
     $m = $this->rootElement->lastUsedMethod; 
     unset($this->rootElement->$m); // Unset HTML object from root object so that a new object can replace it 
     return $s; 
    } 
} 

class HtmlElement { 

    protected $parent; // Parent class object 

    function __construct(&$parent) { 
     $this->parent = &$parent; 
    } 

    function __get($name) { 
     if ([email protected]_object($this->$name)) { 
      $this->$name = new ElementAttribute($this, $name); 
     } 
     return $this->$name; 
    } 

} 

class Form { 

    public $id; // Form Id 
    public $name = ''; // Form Name 
    public $ids = array(); // List of object Ids within the form 
    public $names = array(); // List of object Names within the form 
    public $lastUsedMethod; // Track last used dynamic method 

    function __get($name) { 
     if ($name == 'open') { // Open current HTML element tag 
      $this->$name = new ElementAttribute($this, get_class($this)); 
     } else if ($name == 'insert') { // Insert new HTML element 
      $this->$name = new HtmlElement($this); 
     } 
     $this->lastUsedMethod = $name; 
     return $this->$name; 
    } 

} 

Некоторые примеры того, как использовать его:

$Form = new Form(); 

echo $Form->open->id('signup')->method('post')->autocomplete('off')->autocorrect('off')->action('/toto'); 

var_dump($Form); 

echo $Form->insert->input->type('text')->name('firstName')->maxlength('100')->value('First name'); 

var_dump($Form); 

echo $Form->insert->input->type('text')->name('lastName')->maxlength('100')->value('Last name'); 

var_dump($Form); 
Смежные вопросы