如何找出页面上的哪些对象使用某个类

时间:2015-12-15 16:20:14

标签: php class object

我有一个旧网站可以达到标准,但我必须以某种方式处理事情,因为时间问题和某些限制阻止了我从下往上正确重组整个网站的冲动。

大部分工作涉及更新各种include文件。 因此,这些包含文件被调用到一个页面中,该页面使用类来生成对象,通常,

问题:

有很多页面并且它们没有一致编码(感谢网站上的不合标准的先前开发人员),所以有时候我想使用的类是在一个名为$database的对象中,有时在其他页面上该对象称为$dataBase$connection等等。

我正在处理几个包含,我觉得必须为每个页面上的每个包含创建一个新对象效率极低,因此这个问题:

我可以从PHP中找出哪些对象变量使用某个类?

插图:

Page index.php

require "class.sausages.inc.php";
$hotdog = new sausages();

$hotdog->somefunction();
//etc. etc.

include "some_file_i_need_to_work_on.php";

include "/folder/some_other_file_I_work_on.php";

//etc. etc.

Page index2.php

require "class.sausages.inc.php";
$hotdogs = new sausages();

$hotdogs->someOtherfunction();
//etc. etc.

include "some_file_I_need_to_work_on_3.php";

include "/folder/some_other_file_I_work_on.php";

//etc. etc.

所以我需要处理包含,因此对于每个包含文件我不确定包含父文件中创建的变量对象的$name。我只有它使用类sausages

解决方案尝试

我看了how to check if object of a class already exists in PHP?,它有几乎相同的问题,但这里标记的解决方案是生成一个全局,我觉得这是另一层,说实话我不太舒服用它作为一种有效的解决方案。

我想要避免的是这样一种情况:特定页面上的每个包含都必须生成自己的object,所有这些都来自父页面中建立的同一个类(通常)。

因为如果包含另一个包含内容,则不包含任何内容,我不认为我可以生成包含可以全部集体使用的对象,或者如果可以的话,我怎么能这样做?

我想要什么

我希望能够找到一种在PHP中建立的方法:

  

是否使用此类生成了任何对象?

     

是?在此包含使用该对象。

     

没有?从类文件中生成一个新对象。

这可能吗?

注意:

  • 大约有十几个包含文件,

  • 有很多父页面(50+)。我认为编辑每一个都是效率低下的(但这将在未来完成)

  • 某些父网页包含一些包含文件,其中一些包含其他文件。没有任何保证包含在哪些文件中(据我所知到目前为止)。

  • 大多数但不是所有父页面都已经建立了一个类对象。

  • PHP 5.6.16

2 个答案:

答案 0 :(得分:4)

按照:

http://php.net/manual/en/internals2.opcodes.instanceof.php

您可以检查某个变量是否是某个类的实例:

    if ($hotdog instanceof sausages){
        // use $hotdog
    }

    else {
        // create and use $hotdog
    }

但它不会告诉你有关其他变量的任何信息。

您也可以使用:

http://php.net/manual/en/function.get-defined-vars.php

将所有已定义的变量列表放入数组中。然后,您可以遍历数组以查看是否存在您感兴趣的类的任何实例。

    foreach (get_defined_vars() as $var)
    {
        if ( $var instanceof sausage) {
            // use this var
        }
    }

此解决方案可以满足您的需求,但您应该注意,创建新对象可能更安全。在include中使用已实例化的对象时,您不知道对该对象执行了哪些其他操作。当你开始使用它时,香肠可能会被很好地炸掉,它可能不会完全符合你的需要。

您还应该查看singleton pattern

使用此模式,您始终可以获取同一个类的实例,并确保在应用程序中只创建了一个实例。

要回到原来的应用程序,请说要确保应用程序中只有一个香肠类实例。

  • 在香肠类中定义一个单例方法
  • 使用new sausages
  • 搜索/替换sausages::singleton()的所有出现
  • 在include中,您可以安全地使用$ hotdogs = sausages :: singleton();

这将使代码更清晰,而不是试图检测是否存在任何全球香肠实例。

答案 1 :(得分:0)

结论;我最终得到了Karolis的答案,并为正确的对象变量生成了一个搜索系统,如果已经定义了一个新的那个,则无需发起新的搜索系统:

在我的每个人的顶部:

foreach (get_defined_vars() as $varKey => $variable) {
    if(is_object($variable) && $variable instanceof sausages) {
        $$varKey = $variable;
    }
}

//$$varKey = this is the instance object. 

显然,如果没有设置instanceof的代码,这里没有详细说明,但这段代码到目前为止对我有用。