如何在变量类上调用静态方法?

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类型,在这种情况下包含类名和方法名.