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

2022-08-30 11:39:42

我正在尝试创建某种函数,从给定变量加载和实例化类。像这样:

<?php
function loadClass($class) {
  $sClassPath = SYSPATH."/classes/{$class}.php";
  if (file_exists($sClassPath)) {
    require_once($sClassPath);
    $class = $class::getInstance();
  }
}
?>

如果我像这样使用它:

<?php
  loadClass('session');
?>

它应该包含并实例化会话类。

顺便说一句:静态 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];
    }

  }

?>

问题是,现在在类中使用函数的方式是这样的:

<?php
  $session = session::getInstance();
?>

但现在我想把它构建成一个函数,这样我就再也不用使用那行代码了。我只是说loadClass('session');并且我可以使用$session->blablablafunction();


答案 1

在 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;
  }

}

只需加载类,而无需从中创建对象。然后从 loadClass() 函数外部调用 “::getInstance()” 对那些意味着是单例的,对那些不是单例的调用 “new”。

虽然,正如其他人之前指出的那样,__autoload()可能很适合您。


答案 2

您可以使用 call_user_func()

$class = call_user_func(array($class, 'getInstance'));

在这种情况下,第一个参数是包含类名和方法名的回调类型。


推荐