Вы делаете foreach($functionNames as $functionName){
, что означает, что $functionName
является строкой , а не массивом. Поэтому не используйте $functionName[0]
.
method_exists
принимает 2 параметра. Один - это объект, а другой - имя метода. Оно должно быть:
method_exists($this, $functionName)
Что касается создания функции, вам не нужно ()
на оставил сторону =
. Оно должно быть:
$this->$functionName = function($params) use($variable){
echo $variable;
};
The use($variable)
необходимо сказать PHP, чтобы использовать эту переменную внутри функции. Вот как работают замыкания на PHP, он отличается от других языков.
Итак, ваш класс должен выглядеть следующим образом:
class Something{
public function __construct(){
$functionNames = array('foo', 'bar');
$variable = 'blablabla';
foreach($functionNames as $functionName){
if(method_exists($this, $functionName)){
continue;
}
$this->$functionName = function($params) use($variable){
echo $variable;
};
}
}
}
Проблема здесь в том, что таким образом сделать функции, вы на самом деле не создает метод класса, но вместо того, чтобы создать переменную класса, который содержит функцию.
Таким образом, вы должны назвать его так:
$test = new Something;
$foo = $test->foo;
$foo('abc');
Вы не можете просто сделать $test->foo('abc');
.
EDIT: Другое, что вы можете сделать, это использовать «магический метод» PHP __call
. Это будет выполняться всякий раз, когда вы делаете ->funcName()
, независимо от того, существует ли метод или нет. Используя этот метод, вы можете просто проверить, был ли метод вызван 'foo'
или 'bar'
. Смотрите пример:
class Something{
private $variable;
public function __construct(){
$this->variable = 'blablabla';
}
public function __call($name, $params=array()){
if(method_exists($this, $name)){
// This makes sure methods that *do* exist continue to work
return call_user_func(array($this, $name), $params);
}
else{
$functionNames = array('foo', 'bar');
if(in_array($name, $functionNames)){
// You called ->foo() or ->bar(), so do something
// If you'd like you can call another method in the class
echo $this->variable;
}
}
}
}
С этим, теперь вы можете сделать следующее:
$test = new Something;
$test->foo('abc'); // Will echo "blablabla"
Я не думаю, что это возможно в PHP в том, что вы делаете это. Я думаю, вам нужно создать экземпляр объекта или вернуть функцию, которая присваивает что-то переменной. Не плохой вопрос. –
Вы не можете вернуться в конструктор класса. Это вызовет ошибку. http://php.net/manual/en/language.oop5.decon.php – versalle88
@ versalle88 да, это правда ... У меня на самом деле есть цикл foreach, а 'return;' - 'continue;', но я решил немного упростить код, поскольку (я думал) это не было необходимо. Я отредактирую его, хотя – Jonan