上次使用了纯php实现了一个观察者模式(php观察者模式), 现在使用php标准库spl在次实现观察者模式,好处是:随意的生成您想使用的观察者!
<?php /** * Created by PhpStorm. * User: evolution * Date: 14-12-27 * Time: 下午5:50 */class Login implements SplSubject { private $storage; public $status; public $ip; const LOGIN_ACCESS = 1; const LOGIN_WRONG_PASS = 2; const LOGIN_USER_UNKNOWN = 3; function __construct(){ $this->storage = new SplObjectStorage(); } function attach (SplObserver $observer) { $this->storage->attach($observer); } function detach(SplObserver $observer){ $this->storage->detach($observer); } function notify(){ foreach ($this->storage as $obs) { $obs->update($this); } } /** * @author jichao.wang * 执行登陆 */ function handleLogin() { $ip = rand(1,100); switch (rand(1, 3)) { case 1: $this->setStatus(self::LOGIN_ACCESS, $ip); $ret = true; break; case 2: $this->setStatus(self::LOGIN_WRONG_PASS, $ip); $ret = false; break; case 3: $this->setStatus(self::LOGIN_USER_UNKNOWN, $ip); $ret = false; break; } /** * handle event */ $this->notify(); return $ret; } /** * @param $status * @author jichao.wang * set login status */ function setStatus($status,$ip) { $this->status = $status; $this->ip = $ip; } /** * @return mixed * @author jichao.wang * get login status */ function getStatus() { return $this->status; }}/** * 只针对登陆的贯观察者 * Class LoginObserver */abstract class LoginObserver implements SplObserver { private $login; function __construct(Login $login){ $this->login = $login; $login->attach($this); } /** * 对外统一的访问点 * @param SplSubject $subject */ function update( SplSubject $subject ){ if($subject === $this->login){ $this->doUpdate($subject); } } abstract function doUpdate( Login $login );}/** * Class EmailObserver */class EmailObserver extends LoginObserver{ //不同功能的观察者实现不同的功能 function doUpdate( Login $login ){ $status = $login->getStatus(); if($status == Login::LOGIN_ACCESS){// $this->sendMail('用户ip:'.$observable->ip.'登陆成功!'); echo __CLASS__.'用户ip:'.$login->ip.'登陆成功!'.'------------------'; } if($status == Login::LOGIN_WRONG_PASS){// $this->sendMail('用户ip:'.$observable->ip.'登陆失败,密码错误!'); echo __CLASS__.'用户ip:'.$login->ip.'登陆失败,密码错误!'.'------------------'; } if($status == Login::LOGIN_USER_UNKNOWN){// $this->sendMail('用户ip:'.$observable->ip.'登陆失败,无此用户!'); echo __CLASS__.'用户ip:'.$login->ip.'登陆失败,无此用户!'.'------------------'; } }}//实例化登陆信息$login = new Login();//实现发邮件观察者new EmailObserver($login);//开始登陆$login->handleLogin();

Laravel simplifies handling temporary session data using its intuitive flash methods. This is perfect for displaying brief messages, alerts, or notifications within your application. Data persists only for the subsequent request by default: $request-

The PHP Client URL (cURL) extension is a powerful tool for developers, enabling seamless interaction with remote servers and REST APIs. By leveraging libcurl, a well-respected multi-protocol file transfer library, PHP cURL facilitates efficient execution of various network protocols, including HTTP, HTTPS, and FTP. This extension offers granular control over HTTP requests, supports multiple concurrent operations, and provides built-in security features.

Laravel provides concise HTTP response simulation syntax, simplifying HTTP interaction testing. This approach significantly reduces code redundancy while making your test simulation more intuitive. The basic implementation provides a variety of response type shortcuts: use Illuminate\Support\Facades\Http; Http::fake([ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

Do you want to provide real-time, instant solutions to your customers' most pressing problems? Live chat lets you have real-time conversations with customers and resolve their problems instantly. It allows you to provide faster service to your custom

PHP logging is essential for monitoring and debugging web applications, as well as capturing critical events, errors, and runtime behavior. It provides valuable insights into system performance, helps identify issues, and supports faster troubleshoot

Article discusses late static binding (LSB) in PHP, introduced in PHP 5.3, allowing runtime resolution of static method calls for more flexible inheritance.Main issue: LSB vs. traditional polymorphism; LSB's practical applications and potential perfo

Laravel simplifies HTTP verb handling in incoming requests, streamlining diverse operation management within your applications. The method() and isMethod() methods efficiently identify and validate request types. This feature is crucial for building

The Storage::download method of the Laravel framework provides a concise API for safely handling file downloads while managing abstractions of file storage. Here is an example of using Storage::download() in the example controller:


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

PhpStorm Mac version
The latest (2018.2.1) professional PHP integrated development tool

MantisBT
Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.

SublimeText3 Linux new version
SublimeText3 Linux latest version

SecLists
SecLists is the ultimate security tester's companion. It is a collection of various types of lists that are frequently used during security assessments, all in one place. SecLists helps make security testing more efficient and productive by conveniently providing all the lists a security tester might need. List types include usernames, passwords, URLs, fuzzing payloads, sensitive data patterns, web shells, and more. The tester can simply pull this repository onto a new test machine and he will have access to every type of list he needs.

EditPlus Chinese cracked version
Small size, syntax highlighting, does not support code prompt function
