2016-03-29 3 views
0

Я бы хотел вызвать статическую функцию класса A в классе B, передав ее через Start.php в качестве параметра, но без включения ClassA.php в ClassB.php.PHP статическая функция как параметр с впрыском зависимостей

Причина, по которой я хочу это сделать, состоит в том, что у меня есть какая-то конкретная клиентская логика, которую я хочу разделить и позвонить по центру и только тогда, когда мне это действительно нужно (index.php), не включая ее в другие файлы.

Предположим, у меня 3 файла.

Start.php, ClassA.php, ClassB.php 

ClassA.php

class A { 

    public static function foo($param) { 
    // do some special logic 
    // and return either true or false 
    } 

} 

ClassB.php

class B { 

    function bar($var, $func) { 
     foreach($var as $v) { 
     if($func($var)) { 
      echo 'OK'; 
     } 
     } 
    } 

} 

Start.php

require_once('ClassA.php'); 
require_once('ClassB.php'); 

class Start() { 

    function init() { 
    $b = new B(); 
    $test = array(1,2,3,4,5); 
    $b->bar($test, ['A', 'foo']); 
    } 
} 

Start::init(); 

Итак, Start зависит от ClassA и ClassB, это нормально.

Но я не хочу, чтобы ClassB зависел от ClassA.

Когда я делаю это так, я получаю ошибку, говоря, что класс А не найден.

Возможно ли это? Это даже считается хорошей практикой?

+0

«Но я не хочу ClassB зависеть от ClassA.» Однако, если вы используете ClassA в ClassB, ClassB зависит от ClassA. – n00dl3

+0

Используя автозагрузку, вы можете загружать свои классы по требованию. – n00dl3

+0

Возможно, вы можете реализовать это с помощью интерфейсов. – AmazingDreams

ответ

0

Я должен был обеспечить полное пространство имен для вызова функции, так:

$b->bar($test, ['my\\namespace\\A', 'foo']); 
0

Я думаю, что вы идете по этому неправильно. Фактически, синтаксис, который вы используете здесь, был изменен в PHP7. Давай приберёмся

class B { 
    function bar($var, $func) { 
     $method = $func[0] . '::' . $func[1]; 
     foreach($var as $v) { 
     if(call_user_func($method, $v)) { 
      echo 'OK'; 
     } 
     } 
    } 
} 

Так что мы делаем здесь, мы говорим PHP использовать статические функции в массиве, а затем непосредственно назвав его помощью точной call_user_func функции (это считается лучшей практикой) , Обратите внимание, что я предположил, что ваш вызов будет всегда статичным, но он будет работать с любым классом, который вы проходите таким образом.

Вы можете увидеть это в действии здесь https://3v4l.org/WpeiD

+0

Эта работа! ;-) Но мои работы тоже. Я должен был предоставить полное пространство имен для вызова –

Смежные вопросы