【问题标题】:how to include script of variables in a class? undefined variable如何在类中包含变量脚本?未定义的变量
【发布时间】:2015-06-11 13:24:38
【问题描述】:

得到了一个脚本,其中包含表示数据字段的字符串变量,就像它们在数据库中一样。因为这个项目是一团糟,这是一个清理它的阶段,而不必在许多地方重写字段名称。

所以一个脚本'DataKeys.php' 会将变量设置为字段名称。

//results from query1
$keyField1  = 'field1';
$keyField2 = 'field2';

上面的这两个变量只是一个更长列表的 sn-p。

我想在格式化数据时访问此文件并使用这些变量,以便对前端更友好。这个脚本在一个类中被访问,但是在类中没有找到在脚本中定义的字段$keyField1。我确实在那里有实际的字符串,但我认为单个访问点最好,所以当我将来进行更改时,我不需要搜索整个项目。

class DataFormatter {
    //put your code here
    public function __construct() {
        $documentRoot = filter_input(INPUT_SERVER, "DOCUMENT_ROOT");
        include ($documentRoot . '/database/values/DataKeys.php');
    }

    public function cleanData($data){
        if (is_null($data) || empty($data)) 
        {
            return;
        }

        foreach($data as $row){
            $field1Value = $row[$keyField1];
            unset($row[$keyField1]);
        }
    }
}

我还尝试将包含移到类定义之外。

$documentRoot = filter_input(INPUT_SERVER, "DOCUMENT_ROOT");
include ($documentRoot . '/database/values/DataKeys.php');

正在报告的错误是:

Undefined variable: keyField1

灵魂 也许不是最佳方式,但我采用了 include 语句并将其放在函数中。上面的代码只是我试图实现的演示,而不是我正在使用的实际代码。

【问题讨论】:

  • 在构造函数范围内设置值不会做任何事情,因为一旦构造函数完成它们就会消失。如果你真的想这样做,你需要在你的所有行前面加上public(或private等),并将它直接包含在类本身中。一个稍微体面的解决方案是解析而不是将文件包含在构造函数中以设置属性,例如$this->keyField1 = ...。但请注意,您可能必须重写所有内容,因为示例中的几乎所有变量都超出范围/未定义/未使用。
  • @jeroen 嗯,所以您是说我无法从外部 php 脚本访问这些变量并将它们像一组全局变量一样使用,但只能在请求访问文件的类中使用?
  • 在需要它们的每个方法中都声明它们是全局的。
  • @jeroen 好的,那么我应该如何将这两个字段声明为全局并仅在 cleanData() 函数中访问它们?
  • 如果你只需要它们,你应该在那里包含文件,你的问题将在这个类中得到解决。

标签: php class include


【解决方案1】:

这 2 个变量在“包含”之后可用。 例如,您可以将 2 个值放在对象的属性中

include ...;
$this->keyField1 = $keyField1;
$this->keyField2 = $keyField2;

【讨论】:

  • 有没有一种方法可以将您添加到 DataFormatter 中的这些变量放在一个名为 DataKeys 的单独文件中?所以我可以从外部位置引用它们。我刚刚提供了一个包含更长字段名称列表的模板。
【解决方案2】:

您必须将 DataKeys.php 分配给班级成员。

class DataFormatter {
    private $keyField1;
    private $keyField2;

    public function __construct($filename) {
        include $filename;
        $this->keyField1 = $keyField1;
        $this->keyField2 = $keyField2;
    }
}

$dataFormatter = new DataFormatter(filter_input(INPUT_SERVER, 'DOCUMENT_ROOT') . '/database/values/DataKeys.php');

【讨论】:

  • 有没有一种方法可以将您添加到 DataFormatter 中的这些变量放在一个名为 DataKeys 的单独文件中?所以我可以从外部位置引用它们。我刚刚提供了一个包含更长字段名称列表的模板。
猜你喜欢
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
  • 1970-01-01
  • 2013-07-05
  • 2017-01-22
  • 2013-11-19
  • 2012-04-18
  • 2021-07-25
相关资源
最近更新 更多