Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP OOP:创建消息的全局数组_Php_Oop - Fatal编程技术网

PHP OOP:创建消息的全局数组

PHP OOP:创建消息的全局数组,php,oop,Php,Oop,我试图在PHP类的末尾显示一个消息数组。我的消息处理程序正在工作,但仅当我从主父类中“添加_消息”时,并且当我从子类中调用此函数时,消息处理程序才工作。对不起,如果这是含糊不清的,但不知道如何用词的问题 TLDR;如何添加来自类内示例的消息? 主父类 class Init { public function __construct() { $this->load_dependencies(); $this->add_messages();

我试图在PHP类的末尾显示一个消息数组。我的消息处理程序正在工作,但仅当我从主父类中“添加_消息”时,并且当我从子类中调用此函数时,消息处理程序才工作。对不起,如果这是含糊不清的,但不知道如何用词的问题

TLDR;如何添加来自类内示例的消息?


主父类

class Init {

    public function __construct() {
        $this->load_dependencies();
        $this->add_messages();
        $this->add_msg_from_instance();
    }

    private function load_dependencies() {
        require_once ROOT . 'classes/class-messages.php';
        require_once ROOT . 'classes/class-example.php';
    }

    public function add_messages() {
        $this->messages = new Message_Handler();
        $this->messages->add_message( 'hello world' );
    }

    // I Would like to add a message from within this instance....
    public function add_msg_from_instance() {
        $example = new Example();
        $example->fire_instance();
    }

    public function run() {
        $this->messages->display_messages();
    }

}
class Example {
    public function fire_instance() {
        $this->messages = new Message_Handler();
        $this->messages->add_message( 'Hello Universe!' ); // This message is NOT being displayed...
    }
}

消息处理程序

class Message_Handler {

    public function __construct() {
        $this->messages = array();
    }

    public function add_message( $msg ) {
        $this->messages = $this->add( $this->messages, $msg );
    }

    private function add( $messages, $msg ) {
        $messages[] = $msg;
        return $messages;
    }


    // Final Function - Should display array of all messages
    public function display_messages() {
        var_dump( $this->messages );
    }

}
示例类

class Init {

    public function __construct() {
        $this->load_dependencies();
        $this->add_messages();
        $this->add_msg_from_instance();
    }

    private function load_dependencies() {
        require_once ROOT . 'classes/class-messages.php';
        require_once ROOT . 'classes/class-example.php';
    }

    public function add_messages() {
        $this->messages = new Message_Handler();
        $this->messages->add_message( 'hello world' );
    }

    // I Would like to add a message from within this instance....
    public function add_msg_from_instance() {
        $example = new Example();
        $example->fire_instance();
    }

    public function run() {
        $this->messages->display_messages();
    }

}
class Example {
    public function fire_instance() {
        $this->messages = new Message_Handler();
        $this->messages->add_message( 'Hello Universe!' ); // This message is NOT being displayed...
    }
}

因为您希望在不同的对象周围保留消息,所以应该传递该对象或使用静态变量

我会使用这样一个静态变量:

class Init {
    public function __construct() {
        $this->load_dependencies();
        $this->add_messages();
        $this->add_msg_from_instance();
    }

    private function load_dependencies() {
        require_once ROOT . 'classes/class-messages.php';
        require_once ROOT . 'classes/class-example.php';
    }

    public function add_messages() {
        // renamed the message handler variable for clarity
        $this->message_handler = new Message_Handler();
        $this->message_handler->add_message( 'hello world' );
    }

    // I Would like to add a message from within this instance....
    public function add_msg_from_instance() {
        $example = new Example();
        $example->fire_instance();
    }

    public function run() {
        $this->message_handler->display_messages();
    }
}

class Message_Handler {
    // use a static var to remember the messages over all objects
    public static $_messages = array();

    // add message to static
    public function add_message( $msg ) {
        self::$_messages[] = $msg;
    }

    // Final Function - Should display array of all messages
    public function display_messages() {
        var_dump( self::$_messages );
    }
}

class Example {
    public function fire_instance() {
        // new object, same static array
        $message_handler = new Message_Handler();
        $message_handler->add_message( 'Hello Universe!' );
    }
}

// testing...
new Init();
new Init();
$init = new Init();
$init->add_msg_from_instance();
$init->add_msg_from_instance();
$init->add_msg_from_instance();
$init->run();

尽管全局变量可能不是最佳设计决策,但您至少有两种方法可以实现您的目标:

  • 使用 如今,它被认为是反模式的,但它是最简单的方法:将消息处理程序设置为单例:

    class MessageHandler
    {
        private static $instance;
    
        private $messages = [];
    
        public static function instance(): self
        {
            if (null === self::$instance) {
                self::$instance = new self();
            }
    
            return self::$instance;
        }
    
        private function __construct()
        {
        }
    
        public function addMessage($message): self
        {
            $this->messages[] = $message;
    
            return $this;
        }
    
        public function messages(): array
        {
            return $this->messages;
        }
    }
    
    然后通过静态方法
    MessageHandler::instance()
    访问它,而不是创建
    MessageHandler
    的新实例。这是

  • 使用容器将同一实例(创建一次并保存在容器中)注入到需要访问它的所有实例中。这种方法更可取,但在一开始没有DI容器的项目中更难实现

  • 您从未调用
    display\u messages()
    。。。顺便说一句:您的代码中没有子类……您从未将
    $messages
    变量保存到任何地方。尝试添加
    受保护的$messages在你的代码> MessageHandler 你应该考虑阅读,因为你的大多数代码是无效的。非常感谢,这帮助我更多地理解静力学!