在另一个类中使用未知类

时间:2018-02-19 13:28:11

标签: php

我想在另一个类中使用带有变量的未知类:

实施例

$classandmethod = "index@show";


    namespace Lib\abc;
    use Lib\xyz;
    class abc{
      function controller($classandmethod)
      {
        $a = explode("@", $classandmethod);
        use Lib\Controller\.$a[0];
      }
    }

但也许不是这样,请帮助大家!

2 个答案:

答案 0 :(得分:2)

来自the manual

  

use关键字必须在文件的最外层范围(全局范围)或命名空间内声明中声明

所以你不能use一个你试图去做的课。然后,要从变量中实例化一个来自不同命名空间的类,而不是use,请提供整个命名空间类:

<?php
namespace G4\Lib
{
    class A
    {
        public $a = "test";
    }
}

namespace G4
{
    class B
    {
        public $a;

        public function __construct($class)
        {
            $class = "\\G4\\Lib\\".$class;
            $this->a = new $class; // here's the magic
        }
    }

    $b = new B("A");
    var_dump($b->a); // test
}

Demo

答案 1 :(得分:1)

主要问题是use不能将变量作为其中的一部分,因为它在解析文件时使用,而变量仅在运行时可用。

这是一个例子,告诉你如何做你想做的事......

<?php
namespace Controller;

ini_set('display_errors', 'On');
error_reporting(E_ALL);

class Index     {
    public function show()   {
        echo "Showing...";
    }
}

$classandmethod = "Controller\Index@show";
list($className,$method) = explode("@", $classandmethod);

$a= new $className();
$a->$method();

显示......

Showing...

您当然可以说所有这些类都必须位于Controller名称空间中,因此代码将更改为

$classandmethod = "Index@show";
list($className,$method) = explode("@", $classandmethod);
$className = "Controller\\".$className;
$a= new $className();
$a->$method();