【问题标题】:php - any way to invoke a method for ALL classes magically?php - 有什么方法可以神奇地调用所有类的方法?
【发布时间】:2016-10-27 22:52:28
【问题描述】:

我已经查看了 PHP 魔术方法,但至少从这些方法中看不到任何方法来实现这一点。

我希望在实例化任何类时“神奇地”调用一个方法,例如__onClassCall(),它没有专门写在类中 - 这将用于调试,我想打开或关闭它.同样,我想在调用类中的任何方法时触发另一个方法,该方法也可以写在其他地方并打开或关闭。这可能吗?

【问题讨论】:

标签: php oop


【解决方案1】:

您可能希望自己实现这些。 __invoke() 魔术方法可能不是您需要的,因为无论如何您仍然必须显式触发它。考虑下面的代码,其中您有一个 MagicHelper 类,其中您声明了您的魔术方法,然后在您的类中使用它们(此处:SomeClassOne)。这可能不是内置的 PHP 函数,但这就是 OOP 的全部内容,对吧?

    <?php

        class MagicHelper{

            public static function __onClassCall(){
                // LOGIC FOR SOME SPECIAL INITIALIZATION ON THE INSTANTIATION OF A CLASS OBJECT GOES HERE...
                // THIS METHOD IS FIRED EACH TIME AN OBJECT IS INSTANTIATED
            }

            public static function __onMethodCall(){
                // LOGIC FOR DEBUGGING GOES HERE...
                // THIS METHOD IS FIRED EACH TIME A METHOD IS CALLED
            }
        }


        class SomeClassOne{
            private $prop;

            public static $CLASS_PREP_ENABLED       = true; //<== COULD BE TURNED OFF OR ON
            public static $METHOD_DEBUG_ENABLED     = true; //<== COULD BE TURNED OFF OR ON

            public function __construct($prop = null) {
                $this->prop     = $prop;

                if(self::$CLASS_PREP_ENABLED){
                    // CALL THE STATIC MAGIC __onClassCall METHOD DECLARED IN THE MagicHelper CLASS
                    // EACH TIME A NEW OBJECT IS INSTANTIATED
                    MagicHelper::__onClassCall();
                }
            }

            function __invoke() {
                // YOU COULD AS WELL USE THIS BUT I DOUBT THIS FITS YOUR DESCRIPTION.
            }

            public function getProp() {
                return $this->prop;
            }

            public function setProp($prop) {
                $this->prop = $prop;
                return $this;
            }

            public function methodOne($paramOne){
                // THE LOGIC FOR THIS METHOD GOES HERE
                //...
                // CALL THE STATIC MAGIC __onMethodCall METHOD DECLARED IN THE MagicHelper CLASS
                // EACH TIME A NEW OBJECT IS INSTANTIATED
                if(self::$METHOD_DEBUG_ENABLED) {
                    MagicHelper::__onMethodCall();
                }

            }

            public function methodTwo($paramTwo){
                // THE LOGIC FOR THIS METHOD GOES HERE
                //...
                // CALL THE STATIC MAGIC __onMethodCall METHOD DECLARED IN THE MagicHelper CLASS
                // EACH TIME A NEW OBJECT IS INSTANTIATED
                if(self::$METHOD_DEBUG_ENABLED) {
                    MagicHelper::__onMethodCall();
                }
            }
        }

【讨论】:

    猜你喜欢
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 2019-10-05
    • 1970-01-01
    相关资源
    最近更新 更多