Use the observer pattern to handle exception information, observer pattern_PHP tutorial

WBOY
Release: 2016-07-13 09:44:27
Original
720 people have browsed it

Use the observer pattern to handle exception information. The observer pattern

The capture of exception information is of great significance to programming testing. Here we combine the observer pattern to explore how to handle exception information.

Regarding the observer mode, if you haven’t come across it yet, there are many excellent bloggers in the blog garden who have explained it in detail. The author feels that the so-called observer pattern must have two important components: a subject object and multiple observers. When using it, we can plug the observer into the socket of the theme object like a plug, and use the theme object to complete the corresponding functions.

Since the observer is to be used as a plug, it must have a unified caliber to plug into the same socket, so first define an interface, Exception_Observer.php:

<?<span>php 
</span><span>/*</span><span>*
 * 定义的规范 
 </span><span>*/</span>
<span>interface</span><span> Exception_Observer{
    </span><span>public</span> <span>function</span> update(Observer_Exception <span>$e</span><span>);
}
 
 </span>?>
Copy after login

Compared to many observers, we should first focus on the only subject object, Observer_Exception.php:

<?<span>php
</span><span>class</span> Observer_exception <span>extends</span> <span>Exception</span><span>{
    </span><span>public</span> <span>static</span> <span>$_observers</span>=<span>array</span><span>();
    </span><span>public</span> <span>static</span> <span>function</span> attach(Exception_Observer <span>$observer</span><span>){
        self</span>::<span>$_observers</span>[]=<span>$observer</span><span>;
    } 
    </span><span>public</span> <span>function</span> __construct(<span>$message</span>=<span>null</span>,<span>$code</span>=0<span>){
        parent</span>::__construct(<span>$message</span>,<span>$code</span><span>);
        </span><span>$this</span>-><span>notify();
    }
    </span><span>public</span> <span>function</span><span> notify(){
        </span><span>foreach</span> (self::<span>$_observers</span> <span>as</span> <span>$observer</span><span>) {
            </span><span>$observer</span>->update(<span>$this</span><span>);
        }
    }
}</span>
Copy after login

We can clearly see that the static variable $_observers is used to place the inserted observers, and notify() is used to notify all observer objects.

Need to pay attention here $observer->update($this); inside $this Many beginners will feel that "it turns out that $this can also be used in this way".

A small question: $_observers Is it okay if it is not a static variable? We will answer this question later.

Define two observers, which in principle implement the functions defined by the interface.

Email_Exception_Observer.php:

<span>class</span> Emailing_Exception_Observer <span>implements</span><span> Exception_Observer{
    </span><span>protected</span> <span>$_email</span>="huanggbxjp@sohu.com"<span>;
    </span><span>function</span> __construct(<span>$email</span>=<span>null</span><span>)
    {
        </span><span>if</span> (<span>$email</span>!==<span>null</span>&&filter_var(<span>$email</span>,<span>FILTER_VALIDATE_EMAIL)) {
            </span><span>$this</span>->_email=<span>$email</span><span>;
        }
    }


    </span><span>public</span> <span>function</span> update(Observer_Exception <span>$e</span><span>){
        </span><span>$message</span>="时间".<span>date</span>("Y-m-d H:i:s").<span>PHP_EOL</span><span>;
        </span><span>$message</span>.="信息".<span>$e</span>->getMessage().<span>PHP_EOL</span><span>;
        </span><span>$message</span>.="追踪信息".<span>$e</span>->getTraceAsString().<span>PHP_EOL</span><span>;
        </span><span>$message</span>.="文件".<span>$e</span>->getFile().<span>PHP_EOL</span><span>;
        </span><span>$message</span>.="行号".<span>$e</span>->getLine().<span>PHP_EOL</span><span>;
        </span><span>error_log</span>(<span>$message</span>,1,<span>$this</span>-><span>_email);
    }
}</span>
Copy after login

Logging_Exception_Observer.php:

<?<span>php 
</span>
<span>class</span> Logging_Exception_Observer <span>implements</span><span> Exception_Observer
{
    </span><span>protected</span> <span>$_filename</span>="F:/logException.log"<span>;
    </span><span>function</span> __construct(<span>$filename</span>=<span>null</span><span>)
    {
        </span><span>if</span> (<span>$filename</span>!==<span>null</span>&&<span>is_string</span>(<span>$filename</span><span>)) {
            </span><span>$thvis</span>->_filename=<span>$filename</span><span>;
        }
    }


    </span><span>public</span> <span>function</span> update(Observer_Exception <span>$e</span><span>){
        </span><span>$message</span>="时间".<span>date</span>("Y-m-d H:i:s").<span>PHP_EOL</span><span>;
        </span><span>$message</span>.="信息".<span>$e</span>->getMessage().<span>PHP_EOL</span><span>;
        </span><span>$message</span>.="追踪信息".<span>$e</span>->getTraceAsString().<span>PHP_EOL</span><span>;
        </span><span>$message</span>.="文件".<span>$e</span>->getFile().<span>PHP_EOL</span><span>;
        </span><span>$message</span>.="行号".<span>$e</span>->getLine().<span>PHP_EOL</span><span>;
        </span><span>error_log</span>(<span>$message</span>,3,<span>$this</span>-><span>_filename);
    }
}</span>
Copy after login

After designing all the main objects and plug-ins, let’s do a small test:

<?<span>php 

</span><span>require</span> 'Exception_Observer.php'<span>;
</span><span>require</span> 'Observer_Exception.php'<span>;
</span><span>require</span> 'Logging_Exception_Observer.php'<span>;
</span><span>require</span> 'Emailing_Exception_Observer.php'<span>;

Observer_Exception</span>::attach(<span>new</span><span> Logging_Exception_Observer());

</span><span>class</span> MyException <span>extends</span><span> Observer_Exception{

    </span><span>public</span> <span>function</span><span> test(){
        </span><span>echo</span> 'this is  a test'<span>;
    }
    </span><span>public</span> <span>function</span><span> test1(){

        </span><span>echo</span> "我是自定义的方法处理这个异常"<span>;
    }

}

</span><span>try</span><span> {
    </span><span>throw</span> <span>new</span> MyException("出现异常,记录一下"<span>);    
} </span><span>catch</span> (MyException <span>$e</span><span>) {
    </span><span>echo</span> <span>$e</span>-><span>getMessage();
    </span><span>echo</span> "<ht/>"<span>;    
}
</span>?>
Copy after login

This example first loads the observer and then performs other operations. Returning to the question raised above, can $_observers not be a static variable? The answer is no. If $_observers is not a static variable, the behavior of loading observers has no impact on subsequent operations. static allows all instance members to share a variable. Even class inheritance works just as well. If you are interested, you can continue to explore the magical effects of static.

This example shows that the output is no different from the general situation, but the difference is that the corresponding log has been generated under the customized file. Although the final function is simple, many people can even implement it in simpler ways with less code. However, when implementing more complex systems, the observer pattern brings us great convenience.

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/1048766.htmlTechArticleUse the observer pattern to handle exception information. The capture of exception information in the observer pattern is of great significance to programming testing. Here Combined with the observer pattern, explore how to handle abnormal information. ...
Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!