如何防止使用"使用" PHP中的范围

时间:2014-08-03 10:16:42

标签: php traits

我想知道是否有办法阻止在PHP中任何类上下文中使用特征方法?

让我用一个简短的例子来解释我想要的东西,这是我目前的代码:

// File : MyFunctions.php
trait MyFunctions {

    function hello_world() {
        echo 'Hello World !';
    }

}

// File : A.php
include 'MyFunctions.php';

class A {

    use MyFunctions;

}

// File : testTraits.php
include 'A.php';

hello_world(); // Call to undefined function -> OK, expected
A::hello_world(); // Hello World ! -> OK, expected
MyFunctions::hello_world(); // Hello World ! -> Maybe OK, but not expected, I'd like to prevent it

关于特征的PHP手册页非常全面,很多案例都得到了处理,但不是这个(http://php.net/manual/en/language.oop5.traits.php

我绝望地试图删除“静态”并使用“公共”,“受保护”,“私人”,但当然,它只是没有用。到目前为止我还没有其他想法,所以也许我错过了什么,或者这只是不可能?

2 个答案:

答案 0 :(得分:5)

使用特征时使用可见性更改功能:

trait MyFunctions {

    private function _hello_world() {
        echo 'Hello World !';
    }

}

class A {

    use MyFunctions { _hello_world as public hello_world ;}
    ...
}

答案 1 :(得分:2)

在PHP中使用traits建立了一个契约,即在trait中定义的函数总是被调用,就好像它们被定义为静态方法一样。

如果确实必须,您可以通过使用测试来包装您的函数来动态解决该行为,该测试确定magic constants __CLASS__之间是否匹配(名称)该特征用于)和__TRAIT__(特征本身的名称)。

如果匹配,则该方法未按预期使用,并相应地调整其行为。

所以你的例子会变成:

trait MyFunctions {

    function hello_world() {
        if (__CLASS__ == __TRAIT__) {
            die('Sorry');
        }
        echo 'Hello World !';
    }

}