【问题标题】:How to load a class by it's name stored in a variable如何通过存储在变量中的名称加载类
【发布时间】:2014-04-23 02:43:05
【问题描述】:

我在一个文件中有一些类,每个类都与类本身同名。我想从给定名称动态加载相关文件并返回类对象,但我只有文件/类名存储在变量中。这怎么可能?

public function loadClass($name) {
    include dirname(__FILE__) . '/classes/' . $name . '.php';
    return $name;
}

【问题讨论】:

标签: php


【解决方案1】:

试试这个,你可以使用Autoloading

function __autoload($name) {       
   include dirname(__FILE__) . '/classes/' . $name . '.php';
}

你可以称你为类,

$obj  = new MyClass1();

【讨论】:

  • 我有一个switch($name),它将根据请求的$name 加载一个文件和一个类,我应该把这个__autoload() 放在哪里?
【解决方案2】:

你应该这样做:

//test.php
class test {
    public function shout() {
        echo "Hello world!";
    }
}

//main file
function loadClass($name) {
    include(dirname(__FILE__) . '/classes/' . $name . '.php');
    return new $name();
}

$class = loadClass('test');
$class->shout(); //prints Hello World!

对于静态方法,请执行以下操作:

//test.php
class test {
    static function shout() {
        echo "Hello world!";
    }
}

//main file
function loadClass($name) {
    include(dirname(__FILE__) . '/classes/' . $name . '.php');
    $name;
}

$class = loadClass('test');
$class::shout(); //prints Hello World!

【讨论】:

  • 我的类和它们的方法是静态的。你能给我看一个静态类的例子吗?和你的版本有区别吗?
【解决方案3】:

解决方案

<?php
spl_autoload_register(function ($name) {
    $path = __DIR__ . '/classes/' . $name . '.php';
    if (is_file($path)) {
        require $path;
    }
});
  • __DIR__ 等同于 dirname(__FILE__)
  • 您可以使用 spl_autoload_register 定义多个自动加载函数。
  • 您应该检查文件是否存在。

多个自动加载示例

多个函数被处理为队列,而不是堆栈。

<?php
spl_autoload_register(function ($name) {
    $path = __DIR__ . '/classes1/' . $name . '.php';
    if (is_file($path)) {
        require $path;
    }
});
spl_autoload_register(function ($name) {
    $path = __DIR__ . '/classes2/' . $name . '.php';
    if (is_file($path)) {
        require $path;
    }
});
$foo = new Foo('bar');

如果./classes1/Foo.php 存在...

  1. $path 在第一个函数中将是 ./classes1/Foo.php
  2. require $path 将被调用。

如果./classes2/Foo.php 存在...

  1. $path 在第一个函数中将是 ./classes1/Foo.php
  2. require $path 将被跳过。
  3. $path 在第一个函数中将是 ./classes2/Foo.php
  4. require $path 将被调用。

【讨论】:

  • 你能给我解释一下吗?
【解决方案4】:

您可以使用$name 变量实例化该类的新实例:

public function loadClass($name)
{
    include dirname(__FILE__) . '/classes/' . $name . '.php';
    return new $name();
}

【讨论】:

  • 这是否适用于通常不需要任何实例化的静态类?
  • 如果它是一个“静态”类你可以调用类$name::blablaMethod()中的静态方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 2017-09-07
  • 1970-01-01
  • 1970-01-01
  • 2013-01-11
相关资源
最近更新 更多