|
|
|
| есть к примеру класс test
<?php
class test {
function simple() {
echo "test function";
}
}
$test = new test();
?>
|
если я подключаю его через require_once:
<?php
require_once"test.php";
$test->simple();
?>
|
код работает нормально
но если подключаю файл через функцию:
<?php
load_class("test");
$test->simple();
function load_class($class) {
require_once"$class.php";
}
?>
|
я теряю создании объект и код:
выдает ошибку: Fatal error: Call to a member function simple() on a non-object in K:\home\test\www\class\core.php on line 4
чтобы избежать такую ошибку нужно создать объект заново
вопрос: можно как то подключить файл через функцию и не потерять создании объект в файле?
заранее спасибо | |
|
|
|
|
|
|
|
для: Dr_Dry
(21.02.2013 в 22:30)
| | Ошибка возникает потому, что создаваемая переменная окажется в области видимости функции load_class(). Соответственно, я вижу несколько решений вашей проблемы:
1. Сделать $test глобальной, что не гуд.
2. Возвращать созданный объект как результат выполнения функции.
3. Создавать объект после подключения файла (вызова функции)
4. Отказаться от использования функции | |
|
|
|
|
|
|
|
для: Igorek
(22.02.2013 в 08:59)
| | думаю связать все в один класс - примерно так:
<?php
class core {
function load($class) {
require_once"$class.php";
}
}
$cms = new core();
$class = array("test","my_class");
foreach($class as $one) {
$cms->load($one);
$cms->$one = new $one;
}
$cms->my_class->show();
echo "<br/>";
$cms->test->show();
?>
|
как вы думаете подойдёт такое решение для даннои проблемы? | |
|
|
|
|
|
|
|
для: Dr_Dry
(22.02.2013 в 13:30)
| | Вы видимо хотите автозагрузчик написать - воспользуйтесь готовыми для этого средствами:
http://www.php.net/manual/ru/language.oop5.autoload.php | |
|
|
|
|
|
|
|
для: Igorek
(22.02.2013 в 13:38)
| | но для того чтобы связать все в один класс подойдёт такое решение что выше написал?
или так будет лучше:
<?php
function __autoload($class) {
include $class . '.php';
}
$cms = new core();
$class = array("test","my_class");
foreach($class as $one) {
$cms->$one = new $one;
}
$cms->my_class->show();
echo "<br/>";
$cms->test->show();
?>
|
| |
|
|
|
|
|
|
|
для: Dr_Dry
(22.02.2013 в 14:14)
| | > но для того чтобы связать все в один класс подойдёт такое решение что выше написал?
не знаю, вам видней.
могу только предположить, что вам надо в ваш класс core включить набор вспомогательных классов. Т.е. инстанцирование объектов тогда логичнее в конструктор класса core вынести.
по ссылке, которую я привел выше, сказано: "spl_autoload_register() предоставляет более гибкую альтернативу для автоматической загрузки классов. По этой причине использовать __autoload() не рекомендуется, а сама функция в будущем может перестать поддерживаться или быть удалена."
хотя, если использовать автозагрузчик только в таком ключе, то можно и без него обойтись, require будет достаточно. Опять же не зная для чего все это - сложно сказать наверняка. | |
|
|
|
|
|
|
|
для: Dr_Dry
(21.02.2013 в 22:30)
| | spl_autoload_register и set_include_path в помощь. и возможно паттерн singleton
[поправлено модератором] | |
|
|
|