首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何找出页面上的哪些对象使用某个类

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

Stack Overflow用户
提问于 2015-12-15 16:20:14
回答 2查看 53关注 0票数 0

我有一个旧的网站,以提高标准,但我必须以某种方式处理事情,由于时间问题和某些限制,阻止我的冲动,以适当地重组整个网站自下而上。

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

问题是:

有很多页面,而且它们没有被一致编码(多亏了网站上以前的开发人员的不合格),所以有时我想要使用的类是在一个名为$database的对象中,有时在其他页面上,这个对象被称为$dataBase$connection等等。

有几种是我正在研究的,我觉得必须为每一页中的每一个包含创建一个新的对象是非常低效率的,因此这个问题:

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

一个例子:

页面index.php

代码语言:javascript
复制
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.

页index2.php

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-15 16:33:37

如下所示:

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

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

代码语言:javascript
复制
    if ($hotdog instanceof sausages){
        // use $hotdog
    }

    else {
        // create and use $hotdog
    }

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

您还可以使用以下内容:

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

在数组中获取所有定义的vars的列表。然后,可以循环遍历数组,查看是否有您感兴趣的类的任何实例。

代码语言:javascript
复制
    foreach (get_defined_vars() as $var)
    {
        if ( $var instanceof sausage) {
            // use this var
        }
    }

这个解决方案可以做您想做的事情,但是您应该注意,创建一个新对象可能更安全。当在包含中使用已经实例化的对象时,您不知道对该对象执行了哪些其他操作。当你开始使用THe香肠的时候,它可能已经很好地被油炸了,而且它可能做不到你想做的事情。

您还应该查看一个singleton pattern

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

回到你的旧应用程序,说你想确保只有一个香肠类的实例在整个应用程序。

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

这将使代码更加清洁,而不是试图检测是否有任何全球性的香肠实例。

票数 4
EN

Stack Overflow用户

发布于 2015-12-17 11:37:21

最后,我得到了卡里奥利的答案,并生成了一个搜索系统来查找正确的对象变量,如果已经定义了一个对象变量,就不需要启动一个新的对象变量:

在我的每一个顶部包括:

代码语言:javascript
复制
foreach (get_defined_vars() as $varKey => $variable) {
    if(is_object($variable) && $variable instanceof sausages) {
        $$varKey = $variable;
    }
}

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34294231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档