如何通过存储在变量中的名称来加载类

时间:2014-03-17 18:11:12

标签: php

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

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

4 个答案:

答案 0 :(得分:1)

试试这个,您可以使用Autoloading

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

你可以称你为班级,

$obj  = new MyClass1();

答案 1 :(得分:1)

你应该这样做:

//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!

答案 2 :(得分:1)

解决方案

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

多个自动加载示例

多个功能被处理为队列,而非Stack。

<?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将被调用。
  3. 如果./classes2/Foo.php存在......

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

答案 3 :(得分:1)

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

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