【问题标题】:Classes - require conflict in constructor类 - 在构造函数中需要冲突
【发布时间】:2013-05-02 21:14:32
【问题描述】:

我正在编写一个 Wordpress 插件,但我不确定函数名冲突..

我有一个名为test_handling.php 的文件,其中包含以下内容:

function testing() { echo 'test'; }

我将此文件包含在类构造函数中(文件名为testcls.class.php):

class TestCls {
   function __construct() {
      require_once('test_handling.php');

      testing();
   }

   function otherfunction() {
      testing();
   }

   // ...
}

在这种情况下,我想知道testing()函数是否仅在TestCls类中可用,或者如果其他WP插件具有相同名称的函数会产生冲突?

【问题讨论】:

    标签: php wordpress scope require


    【解决方案1】:

    即使名称相同,如果定义为类方法,函数的作用域也会不同。要调用常规函数,您将执行以下操作:

    testing();
    

    结果将是:

    'test'
    

    类方法需要类的实例或被静态调用。要调用方法类,您需要以下格式:

    $class->test();
    

    或

    OtherPlugin::test();
    

    总而言之,如果定义为类方法,功能测试会有所不同。这样,你就不会有冲突了。

    封装函数并确保使用正确的方法的其他方法是使用命名空间。如果您在 test_handling.php 中使用命名空间

    <?php
    namespace myname;
    
    function testing(){echo 'test';}
    ?>
    

    您将像这样访问功能测试:

    <?php 
    require_once "test_handling.php";
    
    use myname;
    
    echo myname\testing();
    

    现在你可以确定你正在调用的函数了。

    【讨论】:

    • 因为您没有将其定义为方法类。它是在 test_handling.php 中定义的独立函数。使函数特定于您的范围的其他方法是使用命名空间。
    • 要将其定义为类方法,我只需要在函数定义前加上static关键字,并使用TestCls::testing()来调用这个函数吧?因为它也不起作用..
    • 你必须把它带到你的课堂上。例如,otherfunction 是一个类方法。
    • 在我的情况下,我无法更改此方法(关联的替换过多)。顺便说一句,正如您所说,使用命名空间,我不必修改 otherfunction() 函数?
    • 好吧,我将使用命名空间,感谢您和 bažmegakapa :)!
    【解决方案2】:

    当一个文件被包含时,它包含的代码会继承该变量 包含发生的行的范围。任何可用的变量 在调用文件中的该行将在被调用中可用 文件,从那时起。 但是,所有函数和类 在包含文件中定义的具有全局范围。

    来自include in PHP manual

    这意味着是的,你可以有冲突。

    【讨论】:

    • 那么,你知道我该如何解决这个问题吗?
    • 正如 Jose 所说,@Valentin 命名空间可能是您的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 2012-03-06
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多