Home Backend Development PHP Tutorial 构建自个儿的PHP框架-抽象框架的内容

构建自个儿的PHP框架-抽象框架的内容

Jun 13, 2016 pm 12:24 PM
application controller namespace php

构建自己的PHP框架--抽象框架的内容

上一篇博客中,我们搭建了一个最简单的框架,从单一入口的public/index.php进入,解析出相应的Controller和Action,去执行,渲染出相应的页面或者输出相应的数据。

但是我们可以看到在public/index.php文件中,是一堆代码,如果之后,我要添加权限/事件等等的机制是不是也要也在这里,那不难想象,不就的将来,index.php就会变成一个巨大无比的php文件。我们当然不想看到这样的情景,所以我们需要将这些内容抽象出来,保持入口文件的简单明了。

那我们要将这些内容抽象到那里去呢?有聪明的同学已经想到了,就是之前在composer.json中定义的位置,我们来看一下composer.json文件:

<span style="color: #000000;">{    </span>"name": "craryprimitiveman/simple-framework"<span style="color: #000000;">,    </span>"description": "A simple php framework"<span style="color: #000000;">,    </span>"license": "MIT"<span style="color: #000000;">,    </span>"authors"<span style="color: #000000;">: [        {            </span>"name": "harrysun"<span style="color: #000000;">,            </span>"email": "[email protected]"<span style="color: #000000;">        }    ],    </span>"require"<span style="color: #000000;">: {},    </span>"autoload"<span style="color: #000000;">: {        </span>"psr-4"<span style="color: #000000;">: {            </span>"sf\\": "src/"<span style="color: #000000;">,            </span>"app\\": ""<span style="color: #000000;">        }    },    </span>"repositories"<span style="color: #000000;">: [        {</span>"type": "composer", "url": "http://packagist.phpcomposer.com"<span style="color: #000000;">},        {</span>"packagist": <span style="color: #0000ff;">false</span><span style="color: #000000;">}    ]}</span>
Copy after login

可以看到autoload里的psr-4里还有个sf\\,他的地址是src/,这就是我们要放抽象出的内容的地方。

有人会问,为什么不直接使用app\\ 作为namespace呢?因为想到之后要将src下的内容做成一个composer包,迁移到vendor中。

下面就正式开始抽象了。

在src下创建两个文件夹,一个是base,一个是web。base用来存放基础的类,web用来存放与web相关的类。因为将来框架可能还要支持php脚本的执行,所以要将base和web分开,将来要加php脚本时,只需要建立一个console的文件夹就好了。

在两个文件夹中分别建立Application.php文件。

先来看在base里的Application.php

<span style="color: #000000;">phpnamespace sf\base;</span><span style="color: #0000ff;">use</span> <span style="color: #0000ff;">Exception</span><span style="color: #000000;">;</span><span style="color: #008000;">/*</span><span style="color: #008000;">* * Application is the base class for all application classes. * @author Harry Sun  </span><span style="color: #008000;">*/</span><span style="color: #0000ff;">abstract</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> Application{    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*     * @var string the namespace that controller classes are located in.     * This namespace will be used to load controller classes by prepending it to the controller class name.     * The default namespace is `app\controllers`.     </span><span style="color: #008000;">*/</span>    <span style="color: #0000ff;">public</span> <span style="color: #800080;">$controllerNamespace</span> = 'app\\controllers'<span style="color: #000000;">;    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*     * Runs the application.     * This is the main entrance of an application.     </span><span style="color: #008000;">*/</span>    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> run()    {        </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {            </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$this</span>-><span style="color: #000000;">handleRequest();        } </span><span style="color: #0000ff;">catch</span> (<span style="color: #0000ff;">Exception</span> <span style="color: #800080;">$e</span><span style="color: #000000;">) {            </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$e</span><span style="color: #000000;">;        }    }    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*     * Handles the specified request.     </span><span style="color: #008000;">*/</span>    <span style="color: #0000ff;">abstract</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> handleRequest();}</span>
Copy after login

它是一个抽象类,实现了一个简单的run方法,run方法就是去执行以下handleRequest方法。

它定义了一个抽象方法handleRequest,等待被继承,实现。

它定义了一个controllerNamespace属性,记录controller存放的namesapce,默认值是'app\\controllers'。

再来看在web里的Application.php

<span style="color: #000000;">phpnamespace sf\web;</span><span style="color: #008000;">/*</span><span style="color: #008000;">* * Application is the base class for all application classes. * @author Harry Sun  </span><span style="color: #008000;">*/</span><span style="color: #0000ff;">class</span> Application <span style="color: #0000ff;">extends</span><span style="color: #000000;"> \sf\base\Application{    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*     * Handles the specified request.     * @return Response the resulting response     </span><span style="color: #008000;">*/</span>    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> handleRequest()    {        </span><span style="color: #800080;">$router</span> = <span style="color: #800080;">$_GET</span>['r'<span style="color: #000000;">];        </span><span style="color: #0000ff;">list</span>(<span style="color: #800080;">$controllerName</span>, <span style="color: #800080;">$actionName</span>) = <span style="color: #008080;">explode</span>('/', <span style="color: #800080;">$router</span><span style="color: #000000;">);        </span><span style="color: #800080;">$ucController</span> = <span style="color: #008080;">ucfirst</span>(<span style="color: #800080;">$controllerName</span><span style="color: #000000;">);        </span><span style="color: #800080;">$controllerName</span> = <span style="color: #800080;">$this</span>->controllerNamespace . '\\' . <span style="color: #800080;">$ucController</span> . 'Controller'<span style="color: #000000;">;        </span><span style="color: #800080;">$controller</span> = <span style="color: #0000ff;">new</span> <span style="color: #800080;">$controllerName</span><span style="color: #000000;">();        </span><span style="color: #0000ff;">return</span> <span style="color: #008080;">call_user_func</span>([<span style="color: #800080;">$controller</span>, 'action'. <span style="color: #008080;">ucfirst</span>(<span style="color: #800080;">$actionName</span><span style="color: #000000;">)]);    }}</span>
Copy after login

是不是觉得很眼熟,其实就是将之前放在index.php中的内容放到Application的handleRequest方法里了。

然后我们需要从入口文件调用到这里的代码,这就很简单了,index.php的内容如下:

<span style="color: #000000;">php</span><span style="color: #0000ff;">require_once</span>(__DIR__ . '/../vendor/autoload.php'<span style="color: #000000;">);</span><span style="color: #800080;">$application</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> sf\web\Application();</span><span style="color: #800080;">$application</span>->run();
Copy after login

直接去new一个web Application的实例,执行run方法就可以了,是不是很简单。

访问一下:http://localhost/simple-framework/public/index.php?r=site/test,你可以看到上一次一样的结果。

 

好了,今天就先到这里。项目内容和博客内容也都会放到Github上,欢迎大家提建议。

code:https://github.com/CraryPrimitiveMan/simple-framework/tree/0.2

blog project:https://github.com/CraryPrimitiveMan/create-your-own-php-framework

 

2楼阿水
顶一记!
Re: 疯狂的原始人
@阿水,谢谢支持~~
1楼玻璃鱼儿
PHP的命名空间为什么不和JAVA amp; .NET的类似都用点号分割呢??难道不能实现吗?不可能吧。非要独树一帜,看着别扭还难受。
Re: 疯狂的原始人
@玻璃鱼儿,PHP的namespace原生是不支持用点号分割,其实稍微早一点的框架的实现,是使用点号分割的,那时候PHP还没有支持namespace。
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

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

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

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

PHP 8.4 Installation and Upgrade guide for Ubuntu and Debian PHP 8.4 Installation and Upgrade guide for Ubuntu and Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 brings several new features, security improvements, and performance improvements with healthy amounts of feature deprecations and removals. This guide explains how to install PHP 8.4 or upgrade to PHP 8.4 on Ubuntu, Debian, or their derivati

7 PHP Functions I Regret I Didn't Know Before 7 PHP Functions I Regret I Didn't Know Before Nov 13, 2024 am 09:42 AM

If you are an experienced PHP developer, you might have the feeling that you’ve been there and done that already.You have developed a significant number of applications, debugged millions of lines of code, and tweaked a bunch of scripts to achieve op

How To Set Up Visual Studio Code (VS Code) for PHP Development How To Set Up Visual Studio Code (VS Code) for PHP Development Dec 20, 2024 am 11:31 AM

Visual Studio Code, also known as VS Code, is a free source code editor — or integrated development environment (IDE) — available for all major operating systems. With a large collection of extensions for many programming languages, VS Code can be c

Explain JSON Web Tokens (JWT) and their use case in PHP APIs. Explain JSON Web Tokens (JWT) and their use case in PHP APIs. Apr 05, 2025 am 12:04 AM

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,

PHP Program to Count Vowels in a String PHP Program to Count Vowels in a String Feb 07, 2025 pm 12:12 PM

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

How do you parse and process HTML/XML in PHP? How do you parse and process HTML/XML in PHP? Feb 07, 2025 am 11:57 AM

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

Explain late static binding in PHP (static::). Explain late static binding in PHP (static::). Apr 03, 2025 am 12:04 AM

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.

What are PHP magic methods (__construct, __destruct, __call, __get, __set, etc.) and provide use cases? What are PHP magic methods (__construct, __destruct, __call, __get, __set, etc.) and provide use cases? Apr 03, 2025 am 12:03 AM

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.

See all articles