2016-08-05 3 views
2

Предположим, что я этот класс:Расширить класс в свойстве класса?

class Loader 
{ 
    function library($name) 
    { 
      require $name . '.php'; 
    } 
} 

и теперь включают в себя класс foo ($ название) внутри моего контроллера, как это:

class Controller 
{ 
    function __construct() 
    { 
     $this->load = new Loader(); 
    } 
} 

class Child_Controller extends Controller 
{ 
    function __construct() 
    { 
     parent::__construct(); 
     $this->load->library('foo'); 
     init(); 
    } 
} 

можно, например, доступ к включенный класс внутри $this? Как:

class Child_Controller extends Controller 
{ 
    //..construct above.. 

    function init() 
    { 
     $this->print('some text'); 
    } 
} 

где print является методом foo, класс включены:

class Foo 
{ 
    function print($message) 
    { 
     echo "your message: " . $message; 
    } 
} 

Итак, подводя, я хочу включить в контроллере ребенка, в $this, весь метод включенного класса по классу Loader, расширенному базовым контроллером. Это возможно?

Или другая идея будет создавать динамически в Child_Controller, свойство, принять имя включенного класса, поэтому для вызова метода foo я могу сделать что-то вроде:

$this->Foo->print('some text'); 
+0

Нет, это невозможно. Кроме того, вы могли бы столкнуться с теми же методами класса. Создайте новое свойство и присвойте ему экземпляр класса. –

+0

Да, вы можете. Но для этого требуется много работы. Фактически, автозагрузка/композитор - это то, что вы ищете. – felipsmartins

ответ

0

Нет, не может сделать это, однако вы можете сделать что-то подобное в хранении Foo в общей собственности, как это:

class Child_Controller 
{ 
    private $lib; 

    function __construct() 
    { 
     parent::__construct(); 
     $this->lib = $this->load->library('Foo'); 
     $this->init(); 
    } 

    function init() 
    { 
     $this->lib->print('Hello World!'); 
    } 
} 

Если вы хотите создать несколько библиотек, то вместо того, чтобы использовать динамическое имя переменной, которую вы должны у зе массив с именем библиотеки в качестве ключа, как это:

class Child_Controller 
{ 
    private $libs = []; 

    function __construct() 
    { 
     parent::__construct(); 
     $this->libs['Foo'] = $this->load->library('Foo'); 
     $this->init(); 
    } 

    function init() 
    { 
     $this->libs['Foo']->print('Hello World!'); 
    } 
} 

Если вы не можете использовать массив и абсолютно должны использовать имя переменной вы можете сделать это так:

class Child_Controller 
{ 
    function __construct() 
    { 
     $var = 'Foo'; 
     $this->{$var} = $this->load->library($var); 
     $this->init(); 
    } 

    function init() 
    { 
     $this->Foo('Hello World!'); 
    } 
} 
+0

Umm Мне нравится этот пример, один вопрос: я пробую это в своем коде, но, к сожалению, я получаю: 'Fatal error: вызов функции-члена print on null', может быть, в функции' library' мне нужно вернуть include? – Tekken

+0

Да, функция 'library' должна возвращать экземпляр класса. – Styphon

+0

Хорошо, большое спасибо. У меня только проблема прямо сейчас. Если я это сделаю: var_dump ($ this-> libs ['foo']); 'I get:' int (1) 'и на этом вызове' $ this-> libs ['foo'] -> print() 'Я получу эту ошибку:' Вызовите функцию-член handleLogin() на integer'. Кажется, что return возвращает целое число вместо класса? Что происходит? Еще раз спасибо. – Tekken

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