2013-08-02 3 views
1

Интересно, возможно ли это ниже в объекте класса php, как и в javascript (jquery).PHP-класс: запись функций внутри объекта?

В JQuery, я хотел бы сделать,

(function($){ 


    var methods = { 

    init : function(options) { 
     // I write the function here... 

    }, 

    hello : function(options) { 

      // I write the function here... 
     } 
    } 

    $.fn.myplugin = function(method) { 

    if (methods[method]) { 
      return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); 
     } else if (typeof method === 'object' || ! method) { 
      return methods.init.apply(this, arguments); 
     } else { 
      $.error('Method ' + method + ' does not exist.'); 
     } 
     return this; 
    }; 
})(jQuery); 

Так что, когда я хочу, чтобы вызвать функцию внутри myplugin, я просто делаю это,

$.fn.myplugin("hello"); 

Итак, я подумал, что может быть способ сделать это в php также, когда вы приходите писать класс?

$method = (object)array(
"init" => function() { 
    // I write the function here... 
}, 
"hello" => function() { 
// I write the function here...  

} 
); 

EDIT:

Может быть классом, как это?

class ClassName { 

    public function __construct(){ 
    // 
    } 

    public function method_1(){ 

     $method = (object)array(

      "init" => function() { 
       // I write the function here... 
      }, 
      "hello" => function() { 
      // I write the function here...  

      } 
     ); 

    } 


    public function method_2(){ 

     $method = (object)array(

      "init" => function() { 
       // I write the function here... 
      }, 
      "hello" => function() { 
      // I write the function here...  

      } 
     ); 

    } 

} 

ответ

2

Ваша $.fn.myplugin функция очень похожа на волшебную функцию __call() в PHP. Тем не менее, вы должны определить его в классе и эмулировать логику:

class Example { 
    private $methods; 

    public function __construct() { 
     $methods = array(); 
     $methods['init'] = function() {}; 
     $methods['hello'] = function() {}; 
    } 

    public function __call($name, $arguments) { 
     if(isset($methods[$name])) { 
      call_user_func_array($methods[$name], $arguments); 
     } else if($arguments[0] instanceof Closure) { 
      // We were passed an anonymous function, I actually don't think this is possible, you'd have to pass it in as an argument 
      call_user_func_array($methods['init'], $arguments); 
     } else { 
      throw new Exception("Method " . $name . " does not exist"); 
     } 
    } 
} 

Тогда вы могли бы сделать:

$obj = new Example(); 
$obj->hello(); 

Это не проверял, но, надеюсь, это начало.

+0

спасибо, но не должны они '$ obj = new Example();' и 'public function Example() {}' ?? – laukok

+1

@lauthiamkok - Следовательно, «Это не проверено» ... Я сделаю небольшие изменения. – nickb

0
class ClassName { 

    public function __construct(){ 
    //this is your init 
    } 

    public function hello(){ 
    //write your function here 
    } 

} 

, как можно было бы написать это

затем

$a = new ClassName() 

$a->hello(); 

назвать

+0

это основной класс, который я знаю уже. – laukok

+0

вы хотите анонимный класс? – exussum

+0

Возможно, но что такое анонимный класс? никогда не делал этого раньше. Что хорошего в анонимном классе? – laukok

1

PHP поддерживает Закрытие (анонимные функции) похож на JQuery взглянуть на

function x(callable $c){ 
    $c(); 
} 

затем использовать

x(function(){ 
    echo 'Hello World'; 
});