Как предотвратить использование методов признаков из области «использования» в PHP

Я хотел бы знать, есть ли способ предотвратить использование методов признаков из любого контекста класса в 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 )

Я отчаянно пытался удалить «статические» и использовать «публичные», «защищенные», «частные», но, конечно, это просто не сработало. Пока у меня нет других идей, так что, может быть, я что-то упустил, или это просто невозможно?

Используйте функцию изменения видимости при использовании признака:

 trait MyFunctions { private function _hello_world() { echo 'Hello World !'; } } class A { use MyFunctions { _hello_world as public hello_world ;} ... } 

Использование признаков в PHP устанавливает контракт, что функции, определенные в признаке, всегда можно вызывать, как если бы они были определены как статические методы.

Если вам действительно нужно, вы можете динамически работать с этим поведением, обернув свою функцию тестом, который определяет, существует ли совпадение между магическими константами __CLASS__ (имя класса, в котором используется признак) и __TRAIT__ (имя признака сам).

Если есть совпадение, тогда метод не использовался по назначению, и вы соответствующим образом настраиваете его поведение.

Таким образом, ваш пример станет следующим:

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