Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: как подключить класс и не потерять создании объект
 
 автор: Dr_Dry   (21.02.2013 в 22:30)   письмо автору
 
 

есть к примеру класс 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";
}
?>

я теряю создании объект и код:

$test->simple();

выдает ошибку: Fatal error: Call to a member function simple() on a non-object in K:\home\test\www\class\core.php on line 4
чтобы избежать такую ошибку нужно создать объект заново
вопрос: можно как то подключить файл через функцию и не потерять создании объект в файле?
заранее спасибо

  Ответить  
 
 автор: Igorek   (22.02.2013 в 08:59)   письмо автору
 
   для: Dr_Dry   (21.02.2013 в 22:30)
 

Ошибка возникает потому, что создаваемая переменная окажется в области видимости функции load_class(). Соответственно, я вижу несколько решений вашей проблемы:
1. Сделать $test глобальной, что не гуд.
2. Возвращать созданный объект как результат выполнения функции.
3. Создавать объект после подключения файла (вызова функции)
4. Отказаться от использования функции

  Ответить  
 
 автор: Dr_Dry   (22.02.2013 в 13:30)   письмо автору
 
   для: 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();
?>

как вы думаете подойдёт такое решение для даннои проблемы?

  Ответить  
 
 автор: Igorek   (22.02.2013 в 13:38)   письмо автору
 
   для: Dr_Dry   (22.02.2013 в 13:30)
 

Вы видимо хотите автозагрузчик написать - воспользуйтесь готовыми для этого средствами:
http://www.php.net/manual/ru/language.oop5.autoload.php

  Ответить  
 
 автор: Dr_Dry   (22.02.2013 в 14:14)   письмо автору
 
   для: 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();
?>

  Ответить  
 
 автор: Igorek   (22.02.2013 в 14:33)   письмо автору
 
   для: Dr_Dry   (22.02.2013 в 14:14)
 

> но для того чтобы связать все в один класс подойдёт такое решение что выше написал?
не знаю, вам видней.

могу только предположить, что вам надо в ваш класс core включить набор вспомогательных классов. Т.е. инстанцирование объектов тогда логичнее в конструктор класса core вынести.

по ссылке, которую я привел выше, сказано: "spl_autoload_register() предоставляет более гибкую альтернативу для автоматической загрузки классов. По этой причине использовать __autoload() не рекомендуется, а сама функция в будущем может перестать поддерживаться или быть удалена."

хотя, если использовать автозагрузчик только в таком ключе, то можно и без него обойтись, require будет достаточно. Опять же не зная для чего все это - сложно сказать наверняка.

  Ответить  
 
 автор: psychomc   (22.02.2013 в 13:49)   письмо автору
 
   для: Dr_Dry   (21.02.2013 в 22:30)
 

spl_autoload_register и set_include_path в помощь. и возможно паттерн singleton

[поправлено модератором]

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования