37 php oop class function instance
我正在尝试创建一种从给定变量加载和实例化类的函数.像这样的东西:
<?php
function loadClass($class) {
$sClassPath = SYSPATH."/classes/{$class}.php";
if (file_exists($sClassPath)) {
require_once($sClassPath);
$class = $class::getInstance();
}
}
?>
Run Code Online (Sandbox Code Playgroud)
如果我像这样使用它:
<?php
loadClass('session');
?>
Run Code Online (Sandbox Code Playgroud)
它应该包括并实例化会话类.
BTW:静态getInstance函数来自以下代码:
<?php
function getCallingClass() {
$backtrace = debug_backtrace();
$method = $backtrace[1]['function'];
$file = file($backtrace[1]['file']);
$line = $file[($backtrace[1]['line'] - 1)];
$class = trim(preg_replace("/^.+?([A-Za-z0-9_]*)::{$method}\(.*$/s", "\\1\\2", $line));
if(! class_exists($class)) {
return false;
} return $class;
}
class Core {
protected static $instances = array();
public static function getInstance() {
$class = getCallingClass();
if (!isset(self::$instances[$class])) {
self::$instances[$class] = new $class();
} return self::$instances[$class];
}
}
?>
Run Code Online (Sandbox Code Playgroud)
问题是,现在使用类中的函数的方法是这样的:
<?php
$session = session::getInstance();
?>
Run Code Online (Sandbox Code Playgroud)
但是现在我想将它构建成一个函数,以便我再也不必使用那行代码.我只是说loadClass('session'); 而且我可以使用$ session-> blablablafunction();
tal*_*nes 47
在PHP 5.3中显然可以在变量类名上调用静态函数:
Foo::aStaticMethod();
$classname = 'Foo';
$classname::aStaticMethod(); // As of PHP 5.3.0
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
}
要么
只需加载类而不从中创建对象.然后在那些意味着是单例的东西上调用":: getInstance()",在loadClass()函数之外调用那些不是"new"的东西.
虽然,正如其他人早先指出的那样,__ autoload()可能对您有用.
Gre*_*reg 38
你可以使用call_user_func()
:
$class = call_user_func(array($class, 'getInstance'));
Run Code Online (Sandbox Code Playgroud)
第一个参数是一个callback
类型,在这种情况下包含类名和方法名.