Страница 1 из 1

Вызов функции из класса. Не работают ReflectionMethod и call_user_func

Добавлено: 2022.05.20, 03:53
terrarium volition
Всем доброго дня!

Возникла следующая ситуация:
Есть класс:

Код: Выделить всё

class Databases extends Migration
{
    public function createDB($dbname){
        Yii::$app->db->createCommand("CREATE DATABASE IF NOT EXISTS $dbname")->execute();
    }
 }
Пытаюсь вызвать его метод createDB так:

Код: Выделить всё

$name = 'Testname';
$reflectionMethod = new ReflectionMethod('Databases', 'createDB');
$status = $reflectionMethod->invoke(new Databases(), $name);
и так:

Код: Выделить всё

call_user_func(array('Databases', 'createDB'), $name);
call_user_func('Databases' .'::createDB', $name);
Итог один: метод контроллера, из которого я его вызываю, нормально не завершается, и, соответственно, не происходит render страницы - просто пустой экран и всё.
В debug панели никаких ошибок не видать.
При этом, если я делаю:

Код: Выделить всё

$db = new Databases();
$iscreated = $db->createDB($name);
То работает без проблем.
Что я делаю не так, товарищи? :o

Re: Вызов функции из класса. Не работают ReflectionMethod и call_user_func

Добавлено: 2022.05.22, 10:00
ElisDN
terrarium volition писал(а): 2022.05.20, 03:53 Что я делаю не так, товарищи? :o
Пытаетесь динамический метод вызывать статически.

Сначала как-нибудь создайте объект:

Код: Выделить всё

$databases = new Databases();

// или

$class = 'Databases';
$databases = new $class();
И уже у него вызывайте метод:

Код: Выделить всё

$databases->createDB($name);

// или

$reflectionMethod = new ReflectionMethod($databases, 'createDB');
$reflectionMethod->invoke('createDB', $name);

// или

call_user_func([$databases, 'createDB'], $name);
Но вообще миграции в Yii пишут немного по-другому.

Re: Вызов функции из класса. Не работают ReflectionMethod и call_user_func

Добавлено: 2022.05.22, 16:15
terrarium volition
ElisDN писал(а): 2022.05.22, 10:00
terrarium volition писал(а): 2022.05.20, 03:53 Что я делаю не так, товарищи? :o
Пытаетесь динамический метод вызывать статически.

Сначала как-нибудь создайте объект:

Код: Выделить всё

$databases = new Databases();

// или

$class = 'Databases';
$databases = new $class();
И уже у него вызывайте метод:

Код: Выделить всё

$databases->createDB($name);

// или

$reflectionMethod = new ReflectionMethod($databases, 'createDB');
$reflectionMethod->invoke('createDB', $name);

// или

call_user_func([$databases, 'createDB'], $name);
Но вообще миграции в Yii пишут немного по-другому.
Дмитрий, Спасибо Вам огромное!