通过名称空间内的间接变量引用构造对象

时间:2014-12-20 22:44:33

标签: php instantiation indirect-objects

我希望PHP通过名称空间中的间接变量引用来构造对象。 它就像:

$ArticleObjectIdentifier = 'qmdArticle\excursions_list_item';
$result = new $ArticleObjectIdentifier($parent_obj,$r);

其中qmdArticle是使用的命名空间和excursions_list_item 是类名 - 通常不是硬编码,而是从DB读取。

我收到以下错误 - 使用上述内容时:

Class 'qmdArticle\\excursions_list_item' not found in /media/work/www/mytestarea/control.php on line 1916 ...

的index.php

  <?php
namespace hy_soft\qimanfaya\testarea\main;

use hy_soft\qimanfaya\testarea\articles as article;

include_once('article.php');
$ArticleLoader = 'article\excursions_list_item';
$article = new $ArticleLoader();
$article->showcontent();


?>

article.php

<?php namespace hy_soft\qimanfaya\testarea\articles

  class excursions_list_item {  private $content;       function
 __construct()  {
          $this->content = 'This is the article body';

         // parent::__construct($parent,$dbrBaseRec);
            }

    public function showcontent()   {       echo $this->content;    } } 
?>

1 个答案:

答案 0 :(得分:0)

我终于找到了一个类似的例子但是我花了一段时间才得到它:

实际技巧是使用双引号:&gt;&gt;&#34;&lt;&lt; AND双斜杠&gt;&gt; \&lt;&lt; 它并不适用于像

这样的别名
use hy_soft\qimanfaya\testarea\articles as article;

您必须使用完全限定的类名(FQCN)

$ArticleLoader = "\\hy_soft\\qimanfaya\\testarea\articles\\excursions_list_item";

我仍然会建议如何使用别名来做这件事。感谢。

工作示例: article.php

<?php
namespace hy_soft\qimanfaya\testarea\articles;

class excursions_list_item
{
    private $content;

    function __construct()
    {
         $this->content = 'This is the article body';

        // parent::__construct($parent,$dbrBaseRec);

    }

    public function showcontent()
    {
        echo $this->content;
    }
}
?>

的index.php

<?php
namespace hy_soft\qimanfaya\testarea\main;

use hy_soft\qimanfaya\testarea\articles as article;

include_once('article.php');
$ArticleLoader = "\\hy_soft\\qimanfaya\\testarea\articles\\excursions_list_item";
//$ArticleLoader = "\\article\\excursions_list_item"; doesn't work
$article = new $ArticleLoader();
$article->showcontent();


?>