Уже найдено решение. Мое отображение пропустило пересечение, оно отображалось правильно
Можно использовать call_user_func()
:
$class = call_user_func(array($class, 'getInstance'));
первый аргумент callback
тип, содержащий имя класса и имя метода в этом случае.
Почему бы не использовать __ автозагрузка () функция?
тогда Вы просто инстанцируете объекта при необходимости.
Похоже на борьбу с текущим статическим связыванием реализации PHP которое является, почему Вы переходите через обручи с getCallingClass. Я могу сказать Вам на основе опыта, необходимо, вероятно, отказаться от попытки поместить инстанцирование в родительский класс через статический метод. Это вызовет Вас больше проблем в конце. PHP 5.3 реализует "последнее статическое связывание" и должен решить Вашу проблему, но это, очевидно, не помогает теперь.
Вы - вероятно, более обеспеченное использование функциональности автозагрузки, упомянутой kodisha, объединенным с серьезной реализацией Singleton. Я не уверен, является ли Вашей целью синтаксический сахар или нет, но это думает, что Вы добьетесь большего успеха в конечном счете, чтобы избегать пытаться сохранить несколько символов.
Первое, что пришло на ум, тестирование потребностей, проверка и т.д.:
<?php
function loadClass($className) {
if (is_object($GLOBALS[$className]))
return;
$sClassPath = SYSPATH."/classes/{$className}.php";
if (file_exists($sClassPath)) {
require_once($sClassPath);
$reflect = new ReflectionClass($className);
$classObj = $reflect->newInstanceArgs();
$GLOBALS[$className] = $classObj;
}
}
?>
Вызов статических функций по имени переменной класса, очевидно, доступен в PHP 5.3:
Foo::aStaticMethod();
$classname = 'Foo';
$classname::aStaticMethod(); // As of PHP 5.3.0
http://php.net/manual/en/language.oop5.static.php
Я бы и сам сейчас не отказался от такой возможности.
До тех пор вы не можете считать, что каждый класс, который вы загружаете, создан как синглтон. Пока вы используете < 5.3, вам придется просто загрузить класс и инстанцировать его через конструктор:
function loadClass($class) {
$sClassPath = SYSPATH."/classes/{$class}.php";
if (file_exists($sClassPath)) {
require_once($sClassPath);
$class = new $class;
}
}
ИЛИ
Просто загрузите класс, не создавая из него объект. Затем вызовите "::getInstance()" для тех объектов, которые должны быть синглтонами, и "new" для тех, которые ими не являются, вне функции loadClass().
Хотя, как уже указывали другие, __autoload(), вероятно, будет работать хорошо для вас.