在应该创建对象的表中传递类名

时间:2018-01-26 17:05:53

标签: php

我可以在参数中传递类的名称,以便函数在PHP中创建其对象吗?

class WebManager
{
    $item = null;

    public function set(array $param)
    {
        if ( (isset($_GET['c'])) || (empty($_GET['c'])) ) {

            foreach ($param as $key => $value) {
                if($key == $_GET['c']) {

                    $this->item = new $value; // ?? !!
                    break;
                }
            }

            if($this->item == null) {
                // unknow get param
                // load default
                $this->item = new Default();
            }
        } else {

            //load deafult
            $this->item = new Default();
        }
    }
}

$web = new WebManager();
$in = array('main'=>'', 'about'=>'', 'contact'=>'');
$web->set($in);

我有一个页面,它有n个子页面,每个子页面都有一个类,其中有函数生成html代码和一个返回JS需要子页面加载主类的样式和脚本的函数。

这里出现了一个问题:在主要类的脚本中包含这些类的所有定义是不是一个坏主意?

类MainSubPage {...}< - file main-page.php

class AboutSubWebPage {...}< - file about.php

class ContactSubPage {...}< - file contact.php

并且主/管理类有一个单独的文件,它附带带有需要的子页面类的所有文件。出现的唯一问题是,如果只使用一个文件,为什么要包含这些文件?这是否是对某种理想主义的渴望?只需要类定义加入不是负担或服务器混乱?

2 个答案:

答案 0 :(得分:0)

我没有写出准确的问题。有一个主类包含其中一个类。目前,主类文件包含扩展它的所有类的定义。我问了这个问题,因为在我看来,对于一个主类的文件总是包含它不会使用的类声明是一种不好的做法。所以我需要代码:

function get(string $className, string $classFile)
{
    if (!file_exists($classFile)) {
        echo 'err !';
        return;
    }

    include($classFile);

    if(!class_exists($className)) {
        echo 'err !';
    }

    return new $className();    
}

但加入一个类声明文件是否正确?例如,在这个文件中,我有一个类MainSubPage {public function draw(){...} public function init(){...}}以及我在函数中包含的类似内容。这不会打扰你吗?

答案 1 :(得分:0)

在现代PHP中,使用自动加载功能被认为是最佳实践。如果您对此不熟悉,请继续阅读:http://php.net/autoload

遵循PHP标准也被认为是最佳实践。在这种情况下,这个是相关的:http://www.php-fig.org/psr/psr-4/

此外,随着作曲家无处不在,只要您拥有对开发环境的SSH访问权限,我建议您按照以下方式对代码库进行现代化。

免责声明。进一步解释的一些细节是个人品味的问题。您或其他人可能希望根据您的需要/品味对其进行修改。请随意修复它,因为它只是一个例子。

  1. 为类定义创建src目录。
  2. 将每个类的定义放在一个名称与类名匹配的单独文件中:

    class MainSubPage{...} <- file src/MainSubPage.php
    
    class AboutSubWebPage {...} <- file src/AboutSubWebPage.php
    
    class ContactSubPage {...} <- file src/ContactSubPage.php
    
  3. https://getcomposer.org/

  4. 安装作曲家
  5. composer.json文件添加到您的文档根目录,至少包含以下内容:

    {
        "autoload": {
            "psr-4": {
                "": "src/"
            }
        }
    }
    
  6. 运行composer install。这将在您的文档根目录下创建一个vendor目录。

  7. 在每个入口点的php文件(您的Web服务器直接访问)中,从这一行开始:

    // May have to add more ../'s to match file hierarchy.
    require_once __DIR__ . '/../vendor/autoload.php';
    
  8. 这将教你的脚本如何在不必直接包含源文件的情况下获取类定义。

    PS。使用此模式还有其他一些好处,例如可以在packagist.org上即时访问大量现成的现代网站构建工具。您不需要使用它们,但如果您感兴趣,它们就在那里。