PHP добавить методы в функции - PullRequest
3 голосов
/ 21 июня 2011

Можно ли добавить методы к функциям?

Например:

<?
function func(){
    ;
}
//add method
func->test = function(){
    ;
}

func->test();
func();

Я исходил из фона javascript, и поэтому я привык к тому, что всеобъект '.

РЕДАКТИРОВАТЬ:

Я только что объяснял, откуда часто возникает заблуждение для новых phpers.Я понимаю, что приведенный выше код не работает.

РЕДАКТИРОВАТЬ 2

Разобрался.

class myfunc_class{
    function __invoke(){
            //function body
    }
    function __call($closure, $args)
    {
        call_user_func_array($this->$closure, $args);
    }
}
$func = new myfunc_class;

$func->test = function(){
    echo '<br>test<br>';
};

$func->test();
$func();

Еще сексуальнее:)

class func{
    public $_function;
    function __invoke(){
        return call_user_func_array($this->_function,func_get_args());
    }
    function __construct($fun){
        $this->_function = $fun;
    }
    function __call($closure, $args)
    {
        call_user_func_array($this->$closure, $args);
    }
}
$func = new func(function($value){
    echo $value;
});

$func->method = function(){
    echo '<br>test<br>';
};

$func('someValue');
$func->method();

Ответы [ 5 ]

3 голосов
/ 21 июня 2011

Нет.

Не все является объектом в PHP.Фактически, единственное, что является объектом, это, ну, в общем, объект.Точнее и вообще, экземпляр класса.

Ваш код преобразован в PHP

// function_object.php
<?php

class FunctionObject {

   public method func() {
       // do stuff

   }

}

?>

В другом коде вы можете использовать его так:

<?php

// example.php in same folder as function_object.php
include 'function_object.php';

$FuncObj = new FunctionObject;
$FuncObj->func();

Также: Подробнее о PHP & OOP

1 голос
/ 21 июня 2011

Нет, потому что объект - это конструкция языка PHP, отличная от функции.Функции не имеют свойств, но вместо этого являются просто инструкциями по выполнению.

Но, если func был вместо этого предопределенным классом, тогда да ... с небольшим колдовством, игнорируя общественные протесты, выше читаемостьи стандарты кодирования PHP, и с использованием замыканий с помощью магического метода __call() ...

class func
{

    function __call($func, $args)
    {
        return call_user_func_array($this->$func, $args);
    }

}


$obj = new func;

$obj->test = function($param1, $param2)
{
    return $param1 + $param2;
};

echo $obj->test(1,1);

Это не будет работать, как вы думаетебез __call(), потому что по $obj->test(1,1) PHP думает, что вы пытаетесь вызвать несуществующий метод func, находясь вне области видимости.Но внутри, поскольку новое свойство "test" имеет тип: замыкание, call_user_func_array() просто видит свойство "test" просто как другую функцию, так что вы можете скрыть эту хитрость извнеОбъем.

0 голосов
/ 21 июня 2011

Вы не можете делать то, что пытаетесь, но вы можете определять функции внутри других функций.

В этом примере выводится текст:

function a() {
    function b() { echo 'Hi'; }
}
a();
b();
Output: HiHi

В этом примере выводится ошибка:

function a() {
    function b() { echo 'Hi'; }
}
b();
Output: ERROR
0 голосов
/ 21 июня 2011

В отличие от javacript, в PHP не все является объектом.Поэтому вам нужно различать функцию и класс.

Если вы хотите создать объект, вам нужно определить сначала класс.

class myClass {
}

Затем вы можетедобавьте в класс столько функций, сколько вам нужно.Но вам нужно сначала определить их:

class myClass {
  function test() {
    echo "test!\n";
  }
}

Когда все будет готово, вы можете оживить его:

$class = new myClass;
$class->test();

Оформить заказруководство для более .

0 голосов
/ 21 июня 2011

Вам понадобится ваша функция func() для возврата объекта, тогда вы сможете сделать что-то вроде: func()->test();

Но учтите, что ваш способ обработки объектов в PHP неправильныйи я предлагаю вам прочитать документацию ОО здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...