PHP 命名空间、类自动载入、PSR-0 规范基础框架

本篇概要:

  • 1. 命名空间;
  • 2. 类自动载入;
  • 3. PSR-0 规范基础框架。

1. 命名空间;

  • 最早的时候 PHP 是没有命名空间的,所有的代码是在同一个命名空间之下,这样的话就不能存在相同名称的类和相同名称的函数。
  • 但是当我们的工程越来越大的时候,PHP 文件也会越来越多,也可能会产生越来越多的命名冲突。还有一个问题就是我们的代码越来越复杂,如果能有一个“包”的概念,有层次的去区分每一个类,那就能使代码更加的规范
  • PHP 在 5.3 之后增加了对命名空间的支持。
  • 实例:Test1.php

// PHP 规定,所有的命名空间必须在整个文件之前申明
namespace Test1;

// 接下去所有写的“类”和“函数”都属于 Test1 这个命名空间
// 其它的文件里也可以有 test() 这个函数,只要不是在命名空间 Test1 下,就没有问题
// 命名空间帮我们隔离了所有的类和函数
function test(){
	echo __FILE__;
}

  • 实例:Test2.php

namespace Test2;

function test(){
	echo __FILE__;
}

  • 调用命名空间:实例:test.php

// 如果 Test1.php 和 Test2.php 没有声明命名空间
// 在 require 的时候就直接报错了,因为两个文件里有相同名字的函数 test()
require 'Test1.php';
require 'Test2.php';

// 调用命名空间里的函数:命名空间\函数名
Test1\test();
Test2\test();

2. 类自动载入;

  • 以前 PHP 项目都是通过手工 include 或者 require 来载入依赖的文件。当 PHP 项目变大之后文件越来越多。如果一个 PHP 文件要依赖几十个 PHP 类库,那代码前就要写几十行的 require,这样开发和管理很不方便。如果某个类删除掉了但是还在 require,就会报致命错误。
  • 在 PHP 5.2 之后提供了类的自动载入功能。
  • 实例:Test1.php

class Test1{
	
	static function test(){
		echo __METHOD__;
	}
}

  • 实例:Test2.php

class Test2{
	
	static function test(){
		echo __METHOD__;
	}
}

实例:test.php


//require 'Test1.php';
//require 'Test2.php';

// 自动载入特性,方法1: __autoload()
// 类不存时 PHP 就会自动调用 __autoload() 函数
//function __autoload($class){
//	require __DIR__ . '/'. $class . '.php';
//}

// 但是 __autoload()函数之后被废弃了
// 因为一个 PHP 工程会依赖多个框架,每个框架都调用 __autoload() 就会报函数重复定义的致命错误
// PHP 5.3 之后官方提供了 spl_autoload_register() 函数,可以多次调用
spl_autoload_register('autoload1');
spl_autoload_register('autoload2');

function autoload1($class){
	require __DIR__ . '/'. $class . '.php';
}

function autoload2($class){
	require __DIR__ . '/'. $class . '.php';
}

Test1::test();
Test2::test();

3. PSR-0 规范基础框架。

  • PSR-0 规范是 PHP 业界提出的一个大家共同遵循的面向对象编码规范。

  • 现在有很多的 PHP 框架和开源项目都是符合这个规范的。

  • 这个规范有三项约定

    • PHP 的命名空间必须与绝对路径一致
    • 类名首字母必须大写
    • 除了入口文件外,其它的“ .php ”文件必须只有一个类,不能有可执行代码
  • 开发符合 PSR-0 规范的基础框架

    • 全部使用命名空间
    • 所有 PHP 文件必须自动载入,不能有 include / require
    • 只能有单一入口 index.php
  • 创建入口文件 index.php,App 目录(存放功能逻辑业务代码),Library 目录(存放与业务无关的公共类)

  • 这样就有了两个命名空间(两个文件夹 App 和 Library)

  • 如果在 Library 目录下创建 Obj.php

    • 那么命名空间必须声明为 namespace Library;(和目录名保持一致)
    • 类名必须是 class Obj{ }(类名和文件名一致),文件里不得有任何可执行代码,比如 echo
  • 实例目录:
    PHP 命名空间、类自动载入、PSR-0 规范基础框架_第1张图片

  • Library/Obj.php


namespace Library;

class Obj{

    static function test(){
    }
}

  • App/Controller/Home/Index.php

namespace App\Controller\Home;

class Index{

    static function test(){
        echo __METHOD__;
    }
}

  • Library/Loader.php

namespace Library;

class Loader{
	// 文件自动载入
    static function autoload($class){
    	// $class 为包含了命名空间的一个字符串
    	// var_dump($class); exit; 	// 返回 Library\Obj
    	// BASEDIR . '/' . $class . '.php';
        $file = BASEDIR . '/' . str_replace('\\', '/', $class) . '.php';	//  "\" 转换为 "/"
        //var_dump($file);
        require $file;
    }
}

  • index.php

define('BASEDIR', __DIR__);		// 所有代码的根目录 
include BASEDIR . '/Library/Loader.php';
spl_autoload_register('\\Library\\loader::autoload');

// 两个需要执行的方法
Library\Obj::test();
App\Controller\Home\Index::test();

你可能感兴趣的:(PHP,PHP,面向对象编程)