Class redeclared даже при использовании include_once

eugef

Новичок
Class redeclared даже при использовании include_once

У меня работает вот такой код, который может быть вызван 2 и более раз:
PHP:
if (file_exists(SCRIPT_DIR.$script_name.'.php')) {
  include_once(SCRIPT_DIR.$script_name.'.php');
  /* создаем экземпляр класса*/
  $newclass = new $script_name;
}
В файле $script_name.php содержится описание класса с именем $script_name.

В общем все работало нормально, пока этот код не стали использовать еще два сайта созданных в поддоменах:
www.site.com
sub1.site.com
sub2.site.com
Все 3 сайта используют общие функции.

Вот тут и начались проблемы - если на одной странице каго-либо сайта 2 раза вызывается предыдущий блок операторов с одинаковым значением $script_name, то ИНОГДА выдается сообщение о том что class $script_name redeclared!

Локально отловить не могу - так как ошибка появляется не всегда!

Кто-нибудь встречался с такой проблемой?
Посоветуйте, что делать?
 

God

Новичок
С какого перепугу не будет работать? Должно работать и работает.
 

Acabar

Новичок
скорее есть логические ошибки в скрипте ;] самый оптимальный вариант class_exists...
 

vadim

Guest
eugef
Решение (лдя ПХП5), ведушее в другую сторону, но которое помагает: пусть ПХП сам заботится за подгрузку нужных классов, то есть использовать autoloading
 

eugef

Новичок
tony2001
Потому, что у тебя класс объявляется в разных файлах.
В том то и дело, что класс myclass обьявлен только в одном файле myclass.php и больше нигде! И файлы с классами у меня подгружаются в одном месте программы - по идее include_once не должен 2й раз подгружать один и тот же файл.

Acabar
скорее есть логические ошибки в скрипте ;] самый оптимальный вариант class_exists...
Ошибки возможны :) Буду использовать class_exists
PHP:
if (class_exists($script_name)) {
   /* создаем экземпляр класса*/ 
  $newclass = new $script_name; 
} elseif (file_exists(SCRIPT_DIR.$script_name.'.php')) { 
  include_once(SCRIPT_DIR.$script_name.'.php'); 
  /* создаем экземпляр класса*/ 
  $newclass = new $script_name; 
}
Нормальный вариант?
 

eugef

Новичок
God
Дело в том, что классов много, а функция их подключения только одна - гораздо разумнее поменять одну функцию, а файлы с классами не трогать. Или я не прав?
 

God

Новичок
Файлы с классами лучше "потрогать" - в будущем пригодится, если придётся инклюдить из разных файлов. И представь, что в каком-либо другом файле тебе придется объявить ещё один объект данного класса. Что в этом случае? Писать ещё какую-то заглушку?
Куда проще:
yuorclass.php
PHP:
if (!class_exists('YourClass'))
{
    class YourClass
    {
         ....
    }
}
file1.php
PHP:
include('yuorclass.php');
$obj = new YourClass();
file2.php
PHP:
include('yuorclass.php');
$obj = new YourClass();
и т.д.
 

CCCP_MOCKBA

Новичок
Автор оригинала: God
PHP:
if (!class_exists('YourClass'))
{
    class YourClass
    {
         ....
    }
}
file1.php
PHP:
include('yuorclass.php');
$obj = new YourClass();
file2.php
PHP:
include('yuorclass.php');
$obj = new YourClass();
и т.д.
В чем смысл в данном скрипте функции class_exists() ?
В данном примере class_exists('YourClass') будет всегда возвращать false, сам догадаешься почему?

Автору темы, тебе нужен Сингелтон.
 

God

Новичок
В чем смысл в данном скрипте функции class_exists() ?
В данном примере class_exists('YourClass') будет всегда возвращать false, сам догадаешься почему?
Если только не будет следующего файла file3.php:
PHP:
include('file1.php');
include('file2.php');
Что бывает практически всегда при ООП.

-~{}~ 17.04.06 14:56:

Вдогонку - ещё одна ситуация
mainclass.php
PHP:
if (!class_exists('MainClass'))
{
    class MainClass
    {
         ....
    }
}
yuorclass.php
PHP:
if (!class_exists('YourClass'))
{
    include('mainclass.php');
    class YourClass extends MainClass
    {
         ....
    }
}
file.php
PHP:
include('mainclass.php');
include('yourclass.php');

$obj1 = new YourClass();
$obj2 = new MainClass();
 

CCCP_MOCKBA

Новичок
God
То, что ты пытаешься реализовать, назавается паттерном Сингелтон (Одиночка).
Не изобретай КВАДРАТНОЕ колесо.
 

whirlwind

TDD infected, paranoid
При чем здесь сингельтон? Сингельтон - это объект, а здесь декларация класса. Разницу понимаете?
 

CCCP_MOCKBA

Новичок
в чем смысл такой проверки
PHP:
if (!class_exists('MainClass'))
{
    class MainClass
    {
         ....
    }
}
условие if (!class_exists('MainClass')) сработает только ОДИН раз и вернет false, какой смысл в этом условии?
whirlwind
Я понимаю разницу.
Если я верно уловил суть, God хочет создать ОДИН объект, то это реализуется при помощи соответствующего паттерна, а не как не при помощи class_exists()
 
Сверху