


PHP Three-Layer Structure (Part 2) PHP Implementation of AOP Page 1/2_PHP Tutorial
Source code download address for this article: http://xiazai.jb51.net/201007/yuanma/TraceLWord.rar
The development environment is eclipse(pdt)
Let us focus on the intermediate service layer. The intermediate service layer code is relatively simple. It just calls the data access layer code to save the message to the database. As shown in code 1:
// Code 1
// Intermediate service layer
class LWordServiceCore implements ILWordService {
//Add a message
public function append($newLWord) {
//Call the data access layer
$dbTask = new LWordDBTask();
$ dbTask->append($newLWord);
}
};
After seeing the message board demonstration, the company’s product department and marketing department may propose various ideas and needs. For example, they want to determine the user's permissions before adding a message! Only registered users can leave messages! We need to modify the code, as shown in code 2:
// Code 2, add login Verification
// Intermediate service layer
class LWordServiceCore implements ILWordService {
// Add message
public function append($newLWord) {
if (!($userLogin)) {
// Prompt user to log in
}
// Call the data access layer
$dbTask = new LWordDBTask();
$dbTask->append($newLWord);
}
};
The marketing department also hopes to check the content of the message before adding it. If the message contains swear words, it will not be saved. We continue to modify the code, as shown in code 3:
// Code 3, add swear words Filter
// Intermediate service layer
class LWordServiceCore implements ILWordService {
// Add message
public function append($newLWord) {
if (!($userLogin)) {
// Prompt user to log in
}
if (stristr($newLWord, "SB")) {
// Contains swear words, prompt message sending failure
}
// Call the data access layer
$dbTask = new LWordDBTask();
$dbTask->append($newLWord);
}
};
The product department also put forward new requirements , they hope to add a points mechanism. Specifically, it gives the user +5 points every time they successfully leave a message. We continue to modify the code, as shown in code 4:
// Code 4, add a message Points mechanism
// Intermediate service layer
class LWordServiceCore implements ILWordService {
// Add message
public function append($newLWord) {
if (!($userLogin)) {
// Prompt user to log in
}
if (stristr($newLWord, "SB")) {
// Contains swear words, prompt message sending failure
}
// Call data access Layer
$dbTask = new LWordDBTask();
$dbTask->append($newLWord);
// Give users extra points
$score = getUserScore($userName);
$score = $score + 5;
saveUserScore($userName, $score);
}
};
Not long after, the product department refined the requirements , they hope that users will be upgraded every time they accumulate 1,000 points. We continue to modify the code, as shown in code 5:
// Code 5, add users Upgrade rules
//Intermediate service layer
class LWordServiceCore implements ILWordService {
//Add message
public function append($newLWord) {
if (!($userLogin)) {
// Prompt user to log in
}
if (stristr($newLWord, "fuck")) {
// Contains swear words, prompt message sending failed
}
// Call the data access layer
$dbTask = new LWordDBTask();
$dbTask->append($newLWord);
// Add points to the user
$score = getUserScore($userName);
$score = $score + 5;
saveUserScore($userName, $score);
// Upgrade the user
if (($score % 1000) == 0) {
$level = getUserLevel($userName);
$level = $level + 1;
saveUserLevel($userName, $level);
}
}
};
As demand increases, we need to constantly modify the intermediate service layer code. But it should not be difficult for you to find that the more requirements there are, the more and larger the intermediate service layer code will be! In the end, even if we use the three-layer structure development model, we still cannot effectively reduce the difficulty of the project! In addition, after modifying the intermediate service code in response to changes in demand, all codes need to be retested, instead of effectively testing new codes...
In fact, let us analyze this message board code carefully. I want to first propose A concept of primary business logic and secondary business logic. No matter what, storing the message content in the database is the backbone of the business logic! This is the main business logic! This section has not been modified as demand has increased. As for permission verification and content checking before storing in the database, and adding points to users after storing in the database, and then upgrading users, these are all pre-processing and finishing tasks, and they are all secondary business logic! The main business logic is almost unchanged, but the secondary business logic changes very frequently. In order to improve the readability and maintainability of the code, we can consider placing these secondary business logic elsewhere and try not to let them interfere with the main business logic. The main business logic should concentrate on what it should do. As for anything else, the main business logic will not care about it! Then our code can be written like this, as shown in code 6:
// Code 6. Separate the main business logic and secondary business logic
// Intermediate service layer
class LWordServiceCore implements ILWordService {
// Add message
public function append($newLWord) {
// Before adding a message
beforeAppend($newLWord);
// Call the data access layer
$dbTask = new LWordDBTask();
$dbTask->append($newLWord);
/ / After adding a message
behindAppend($newLWord);
}
};
We can put the permission judgment code and message content text filtering code into the beforeAppend function, The user points code is inserted into the behindAppend function, thus cleaning up the secondary business logic from the main business logic code. The main business logic knows that there is an "overture" function beforeAppend and an "epilogue" function behindAppend, but the main business logic does not know what is specifically done in the overture and epilogue functions, and does not need to know! Of course, the actual coding work is not that simple. We have to take into account more changes in needs of the product department and marketing department, so it is best to implement a plug-in method to deal with such changes, but relying only on the two functions beforeAppend and behindAppend is the best way to achieve this goal. This cannot be achieved~
If you want to implement the plug-in method, you can create an interface! The advantage of using interfaces is that they can isolate definition and implementation, and the other is to achieve polymorphism. We create a message extension interface ILWordExtension, which has two functions beforeAppend and behindAppend. Functions such as permission verification, content inspection, and bonus points can be regarded as three implementation classes that implement the ILWordExtension interface. The main business logic traverses these three implementation classes in order to complete the secondary business logic. As shown in Figure 1:
The CheckPowerExtension extension class is used for user permission verification, the CheckContentExtension extension class is used for message content checking, and the AddScoreExtension extension class is used for adding points and upgrades to users. The schematic code is shown in code 7:

(Figure 1), add the extended interface
// Code 7, add extension interface
// Extension interface
interface ILWordExtension {
// Before adding a message
public function beforeAppend($newLWord);
/ / After adding a message
public function behindAppend($newLWord);
};
// Check permissions
class CheckPowerExtension implements ILWordExtension {
// Before adding a message
public function beforeAppend($newLWord) {
// Determine user permissions here
}
// After adding a message
public function behindAppend($newLWord) {
}
};
// Check message text
class CheckContentExtension implements ILWordExtension {
// Before adding message
public function beforeAppend($newLWord) {
if (stristr($newLWord, "SB")) {
throw new Exception();
}
}
// After adding a message
public function behindAppend($newLWord) {
}
};
// User points
class AddScoreExtension implements ILWordExtension {
// Before adding a message
public function beforeAppend($newLWord) {
}
// After adding a message
public function behindAppend($newLWord) {
// Give users points here
}
};
// Intermediate service layer
class LWordServiceCore implements ILWordService {
//Add a message
public function append($newLWord) {
//Before adding a message
$this->beforeAppend($newLWord);
// Call the data access layer
$dbTask = new LWordDBTask();
$dbTask->append($newLWord);
// After adding a message
$this-> ;behindAppend($newLWord);
}
// Before adding a message
private function beforeAppend($newLWord) {
// Get the extended array
$extArray = $this- >getExtArray();
foreach ($extArray as $ext) {
// Traverse each extension and call its beforeAppend function
$ext->beforeAppend($newLWord);
}
}
// After adding a message
private function behindAppend($newLWord) {
// Get the extension array
$extArray = $this->getExtArray ();
foreach ($extArray as $ext) {
// Traverse each extension and call its behindAppend function
$ext->behindAppend($newLWord);
}
}
// Get the extension array,
// The return value of this function is actually the ILWordExtension interface array
private function getExtArray() {
return array(
// Check permissions
new CheckPowerExtension(),
// Check content
new CheckContentExtension(),
// Bonus points
new AddScoreExtension(),
);
}
};
If there are new requirements, we only need to add the ILWordExtension implementation class and register it in the getExtArray function. The program has since become organized and can be considered scalable.

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

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics











This tutorial demonstrates how to efficiently process XML documents using PHP. XML (eXtensible Markup Language) is a versatile text-based markup language designed for both human readability and machine parsing. It's commonly used for data storage an

JWT is an open standard based on JSON, used to securely transmit information between parties, mainly for identity authentication and information exchange. 1. JWT consists of three parts: Header, Payload and Signature. 2. The working principle of JWT includes three steps: generating JWT, verifying JWT and parsing Payload. 3. When using JWT for authentication in PHP, JWT can be generated and verified, and user role and permission information can be included in advanced usage. 4. Common errors include signature verification failure, token expiration, and payload oversized. Debugging skills include using debugging tools and logging. 5. Performance optimization and best practices include using appropriate signature algorithms, setting validity periods reasonably,

Static binding (static::) implements late static binding (LSB) in PHP, allowing calling classes to be referenced in static contexts rather than defining classes. 1) The parsing process is performed at runtime, 2) Look up the call class in the inheritance relationship, 3) It may bring performance overhead.

A string is a sequence of characters, including letters, numbers, and symbols. This tutorial will learn how to calculate the number of vowels in a given string in PHP using different methods. The vowels in English are a, e, i, o, u, and they can be uppercase or lowercase. What is a vowel? Vowels are alphabetic characters that represent a specific pronunciation. There are five vowels in English, including uppercase and lowercase: a, e, i, o, u Example 1 Input: String = "Tutorialspoint" Output: 6 explain The vowels in the string "Tutorialspoint" are u, o, i, a, o, i. There are 6 yuan in total

What are the magic methods of PHP? PHP's magic methods include: 1.\_\_construct, used to initialize objects; 2.\_\_destruct, used to clean up resources; 3.\_\_call, handle non-existent method calls; 4.\_\_get, implement dynamic attribute access; 5.\_\_set, implement dynamic attribute settings. These methods are automatically called in certain situations, improving code flexibility and efficiency.

PHP and Python each have their own advantages, and choose according to project requirements. 1.PHP is suitable for web development, especially for rapid development and maintenance of websites. 2. Python is suitable for data science, machine learning and artificial intelligence, with concise syntax and suitable for beginners.

PHP is widely used in e-commerce, content management systems and API development. 1) E-commerce: used for shopping cart function and payment processing. 2) Content management system: used for dynamic content generation and user management. 3) API development: used for RESTful API development and API security. Through performance optimization and best practices, the efficiency and maintainability of PHP applications are improved.

PHP is a scripting language widely used on the server side, especially suitable for web development. 1.PHP can embed HTML, process HTTP requests and responses, and supports a variety of databases. 2.PHP is used to generate dynamic web content, process form data, access databases, etc., with strong community support and open source resources. 3. PHP is an interpreted language, and the execution process includes lexical analysis, grammatical analysis, compilation and execution. 4.PHP can be combined with MySQL for advanced applications such as user registration systems. 5. When debugging PHP, you can use functions such as error_reporting() and var_dump(). 6. Optimize PHP code to use caching mechanisms, optimize database queries and use built-in functions. 7
