gpt4 book ai didi

php - laravel 5.1 - 基于字符串动态创建类对象

转载 作者:可可西里 更新时间:2023-11-01 12:23:46 26 4
gpt4 key购买 nike

我想根据来自 URL 参数的字符串创建类对象。

例如:

 http://localhost/CSWeb/api/search/Slideshare

上面URL中的Slideshare是在apiController->indexAction中获取的参数。

slideshare.php 类

<?php

namespace App\Http\API;

class slideshare
{

public function index()
{
return 'any data';

}

}

apiController.php

namespace App\Http\Controllers\API;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use Auth;
use App\Http\API\Slideshare;

class apiController extends Controller
{

public function index($source)
{
$controller= new $source;
return $controller->index();
// if i change code to $controller= new Slideshare; it works fine
}

}

当我使用参数字符串创建类对象时,laravel 出错

FatalErrorException in apiController.php line 17: Class 'Slideshare' not found

如果我将代码更改为

$controller=  new Slideshare; it works fine

提前致谢

最佳答案

当使用字符串创建 PHP 对象时,您必须提供类的完整限定名(也就是包括命名空间)。所以,你应该有这样的东西:

$className = 'App\\Http\\API\\' . $source;

$controller = new $className;

return $controller->index();

另一种方法,如果您确定要实例化的类与您的代码位于同一命名空间中,您可以使用:

$className = __NAMESPACE__ . '\\' . $source;

$controller = new $className;

return $controller->index();

实现相同结果的更详细的方法是通过工厂设计模式。基本上,您创建一个负责实例化元素的类,并将实际创建这些对象的任务委托(delegate)给该类。沿着这些线的东西:

class Factory {
function __construct ( $namespace = '' ) {
$this->namespace = $namespace;
}

public function make ( $source ) {
$name = $this->namespace . '\\' . $source;

if ( class_exists( $name ) ) {
return new $name();
}
}
}


$factory = new Factory( __NAMESPACE__ );

$controller = $factory->make( $source );

这种方法的优点是现在创建对象的责任在工厂,如果你需要改变它,可能允许别名,添加一些额外的安全措施,或任何其他事情,你只需要在一个地方更改该代码,但只要类签名仍然存在,您的代码就会继续工作。

关于工厂的有趣教程: http://culttt.com/2014/03/19/factory-method-design-pattern/

来源: http://nl3.php.net/manual/en/language.oop5.basic.php#language.oop5.basic.new http://php.net/manual/en/language.namespaces.nsconstants.php

关于php - laravel 5.1 - 基于字符串动态创建类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33422627/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com