PHP命名空间与自动加载类详解

本文实例讲述了PHP命名空间与自动加载类。分享给大家供大家参考,具体如下:

今天我要给大家介绍的是PHP的命名空间 和 自动加载类

我先简单的分开演示 在放在一起

大家请看:

什么是自动加载类?

想必大家都应该知道__autoload 这个魔术方法

$db = new DB();
function __autoload($className)
{
echo $className;
exit();
//在这个里面引用类
}

在运用这个类只能加载一次 ,在很多时候我们要引入的不止一个类这个时候怎么办呢!

牛逼的php大神们  出了个新方法 来解决 这个问题  请看就是这个函数

spl_autoload_register() 满足了此类需求。 它实际上创建了 autoload 函数的队列,按定义时的顺序逐个执行。相比之下, __autoload() 只可以定义一次。

这个函数的用法有很多  这里先给大家介绍一种使用方法

如下:

function load1($className)
{
echo 1;
require $className . '.php';
}
spl_autoload_register('load1'); //将load1函数注册到自动加载队列中。
$db = new DB(); //找不到DB类,就会自动去调用刚注册的load1函数了
//php 5.3之后,也可以像这样支持匿名函数了。
spl_autoload_register(function($className){
if (is_file('./lib/' . $className . '.php')) {
require './lib/' . $className . '.php';
}
});

多个spl_autoload_register的使用

判断是否有此文件

如果有引入 如果没有 没有如果了,哪来的如果

function load1($className)
{
  echo 1;
  if (is_file($className . '.php')) {
    require $className . '.php';
  }
}
function load2($className)
{
  echo 2;
  if (is_file('./app/' . $className . '.php')) {
    require './app/' . $className . '.php';
  }
}
function __autoload($className)
{
  echo 3;
  if (is_file('./lib/' . $className . '.php')) {
    require './lib/' . $className . '.php';
  }
}
//注册了3个
spl_autoload_register('load1');
spl_autoload_register('load2');
spl_autoload_register('__autoload');
$db = new DB(); //DB就在本目录下
$info = new Info(); //Info 在/lib/Info.php

我们可以打印spl_autoload_functions()函数,来显示一共注册了多少个自动加载:

var_dump(spl_autoload_functions());
//数组的形式输出
array (size=3)
0 => string 'load1' (length=5)
1 => string 'load2' (length=5)
2 => string '__autoload' (length=10)

命名空间

一个php文件里 是不支持 new 两个名字的

这个时候我们就能用的到命名空间了

namespace app;
class new{
public function ten()
{
echo "85";
}
}
namespace hii;
class new{
public function ten()
{
echo "85";
}
}

spl_autoload_register自动加载+namespace命名空间 的使用

废话不多数  看例子

AutoLoading\loading

<?php
namespace AutoLoading;
class loading {
public static function autoload($className)
{
    //把 \ 转换层 / , 便于兼容Linux文件找。Windows 下是通用的
    //由于namspace 很规格,所以直接很快就能找到
    $fileName = str_replace('\\', '/', DIR . '\\'. $className) . '.php';
    if (is_file($fileName)) {
    require $fileName;
    } else {
    echo $fileName . ' is not exist'; die;
    }
  }
}

上面就是一个自动加载的核心思想方法。下面我们就来spl_autoload_register来注册这个函数:

index.php

<?php
//定义当前的目录绝对路径
define('DIR', dirname(__FILE__));
//加载这个文件
require DIR . '/loading.php';
//采用`命名空间`的方式注册。php 5.3 加入的
//也必须是得是static静态方法调用,然后就像加载namespace的方式调用,注意:不能使用use
spl_autoload_register("\\AutoLoading\\loading::autoload");
// 调用三个namespace类
//定位到Lib目录下的Name.php
Lib\Name::test();
//定位到App目录下Android目录下的Name.php
App\Android\Name::test();
//定位到App目录下Ios目录下的Name.php
App\Ios\Name::test();

由于我们是采用PSR-O方式来定义namespace的命名的,所以很好的定位到这个文件的在哪个目录下了。很爽。对不对。

APP\Android\Name

namespace App\Android;
class Name
{
public function __construct()
{
echo __NAMESPACE__ . "<br>";
}
public static function test()
{
echo __NAMESPACE__ . ' static function test <br>';
}
}

所以就会很容易找到文件,并输出:

Lib static function test
App\Android static function test
App\Ios static function test

好了。基本的东西就讲完了.

更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《PHP网络编程技巧总结》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

(0)

相关推荐

  • PHP命名空间namespace定义及导入use用法详解

    本文实例讲述了PHP命名空间namespace定义及导入use用法.分享给大家供大家参考,具体如下: 在PHP中,出现同名函数或是同名类是不被允许的.为防止编程人员在项目中定义的类名或函数名出现重复冲突,在PHP5.3中引入了命名空间这一概念. 1.命名空间,即将代码划分成不同空间,不同空间的类名相互独立,互不冲突.一个php文件中可以存在多个命名空间,第一个命名空间前不能有任何代码.内容空间声明后的代码便属于这个命名空间,例如: <?php echo 111; //由于namespace前有代

  • PHP命名空间namespace及use的简单用法分析

    本文实例讲述了PHP命名空间namespace及use的简单用法.分享给大家供大家参考,具体如下: 最近一段时间在研究php框架,一直想的什么时候才能开发出自己的框架,当然这是为了提升自己的编程水平,同时能把平时学的零散的东西糅合在一块熟练应用.但是开发一个框架根本不知道如何做起,先开发什么,虽然php的框架也不少,但是都是如何应用,没有文档和视频可以学习,这是让我特别郁闷的事情,相信不少想自己开发框架玩的小伙伴都有类似的感受,郁闷归郁闷,自己还是动手做了,做的时候困难和想象的一样难,从一开始就

  • 实例讲解PHP中使用命名空间

    让我给你一个类的简单例子: <?php namespace Dojo; class Ninja { } 在上面的示例中,我们在Dojo命名空间中创建了一个名为Ninja的新类.如果我们没有使用命名空间,并且我们的应用程序中包含了另一个名为Ninja的类,那么我们将得到一个错误,说明我们不能重新声明类. 那么命名空间就可以解决这个问题.我们可以创建另一个类,像这样: <?php namespace Training; class Ninja { } 现在,如果我们将这两个文件都包含在应用程序中,

  • 详细解读php的命名空间(二)

    一:命名空间里的namespace关键字和__NAMESPACE__常量的运用 PHP支持两种抽象的访问当前命名空间内部元素的方法,__NAMESPACE__ 魔术常量和namespace关键字. 常量__NAMESPACE__会储存当前命名空间的名字字符串,如果当前是全局非命名空间,则保存的是空字符串. 关键字 namespace 可用来显式访问当前命名空间或子命名空间中的元素.它等价于类中的 self 操作符.如果不在当前是全局环境的话,那么显式访问的就是全局限定的元素. __NAMESPA

  • 详细解读php的命名空间(一)

    php的命名空间功能已经出来很久了,但是一直以来没怎么深究过,这次赶着有时间所以特意翻着手册做一个整理和总结帮助自己完善完善,原本准备一篇写完,但发现内容其实还是蛮多的,放一起太长看着累,所以分两篇博客要好些. 一:命名空间概念:命名空间是一种封装事物的方法,类似于目录和文件. 命名空间解决的问题(手册上也写的很清楚,下面按照自己的理解简化了): 1:解决程序编写者自己写的类.常量.函数和php内部的或者第三方的出现名称冲突的情况. 2:创建别名,帮助解决类.常量.函数名称过长的情况,帮助提高代

  • PHP命名空间简单用法示例

    本文实例讲述了PHP命名空间简单用法.分享给大家供大家参考,具体如下: 有三个文件,分别是space1.php,space2.php,use.php吧,在同一目录里. space1.php: <?php namespace MyNamespace\Factory; class Employees{ private $name; function __construct($nameStr){ $this->name = $nameStr; } function getName(){ return

  • PHP面向对象程序设计之命名空间与自动加载类详解

    本文实例讲述了PHP面向对象程序设计之命名空间与自动加载类.分享给大家供大家参考,具体如下: 命名空间 避免类名重复,而产生错误. <?php require_once "useful/Outputter.php"; class Outputter { // output data private $name; public function setName($name) { $this->name = $name; } public function getName()

  • PHP命名空间与自动加载类详解

    本文实例讲述了PHP命名空间与自动加载类.分享给大家供大家参考,具体如下: 今天我要给大家介绍的是PHP的命名空间 和 自动加载类 我先简单的分开演示 在放在一起 大家请看: 什么是自动加载类? 想必大家都应该知道__autoload 这个魔术方法 $db = new DB(); function __autoload($className) { echo $className; exit(); //在这个里面引用类 } 在运用这个类只能加载一次 ,在很多时候我们要引入的不止一个类这个时候怎么办

  • PHP命名空间和自动加载类

    PHP的命名空间(namespace)是php5.3之后才有的.这个概念在C#中已经很早就有了,php中的namespace其实和c#的概念是一样的. 为什么php中要使用namespace? 假设如果不使用namespace,那么每个类在一个项目中的名字就必须是固定的.因为php在new的时候不管是调用autoload还是调用已加载过的类,都存在一个类名对应的文件.所以在没有namespace的时候,我们会想各种命名规则来区分不同的类,比如project1_school1_class1_Stu

  • javaScript 页面自动加载事件详解

    方法1: 复制代码 代码如下: Window.onload=function(){   Var name=document.getElementById("name").val();//加载HTML,并且加载外部所有所有的引用文件(图片,css样式,js等)} 方法2:需要引入Jquery的 .js文件 复制代码 代码如下: $(document).ready(function(){         alert("JQuery的第一个入门案例");//加载HTML,

  • PHP动态地创建属性和方法, 对象的复制, 对象的比较,加载指定的文件,自动加载类文件,命名空间

    PHP前言: •动态地创建属性和方法 •对象的复制 •对象的比较 •加载指定的文件 •自动加载类文件 •命名空间 示例 1.类的相关知识点 3(动态地创建属性和方法) class/class3.php <?php /** * 类的相关知识点 3(动态地创建属性和方法) */ // 用于演示如何动态地创建属性(这就是 php 中所谓的重载) class Class1 { // __set 魔术方法,当设置的属性不存在或者不可访问(private)时就会调用此函数 public function _

  • classloader类加载器_基于java类的加载方式详解

    基础概念 Classloader 类加载器,用来加载 Java 类到 Java 虚拟机中.与普通程序不同的是.Java程序(class文件)并不是本地的可执行程序.当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Java class加载到JVM里头运行,负责加载Java class的这部分就叫做Class Loader. JVM本身包含了一个ClassLoader称为Bootstrap ClassLoader,和JVM一样,BootstrapClassLoader是用本地代码实现

  • 解析zend Framework如何自动加载类

    1.模块中类的自动载入 复制代码 代码如下: $loader = new Zend_Application_Module_Autoloader(array(   //模块内容自动加载类    'namespace' => 'Blog',//命名空间定义 即方法的开头为Blog_    'basePath'  => APPLICATION_PATH . '/modules/blog',//模块位置)); 2. 自动载入 复制代码 代码如下: require_once 'Zend/Loader/A

  • php的命名空间与自动加载实现方法

    类的自动加载 引子 当我们在php代码中加载类时,我们必须要include或者require 某个类文件. 但遇到类似的情况,例如: require "Class1.php"; require "Class2.php"; $boy = $_GET['sex'] = 0?true:false; if($boy) { $class1 = new Class1(); }else{ $class2 = new Class2(); } 假如我们需要判断一个人的性别,如果是男的

  • PHP 命名空间和自动加载原理与用法实例分析

    本文实例讲述了PHP 命名空间和自动加载原理与用法.分享给大家供大家参考,具体如下: PHP 命名空间 php5.3 之后引入了命名空间的特性,从本质上讲,命名空间就是一个容器,你可以将类.函数和变量放在其中,在命名空间中,你可以无条件地访问这些项,在命名空间之外,必须导入或引用命名空间,才能访问它所包含的项. 声明命名空间 namespace my; require_one 'outputter3.php'; class outputter { // 输出数据 public function

  • Yii实现自动加载类地图的方法

    本文实例讲述了Yii实现自动加载类地图的方法.分享给大家供大家参考.具体如下: Yii继承的一个静态属性$classMap,可以用于Yii的自动加载类地图.数组中的键是类名,数组中的值是相应类文件的路径. require_once($yii); $app = Yii::createWebApplication($config); Yii::$classMap = array( 'JPhpMailer' => Yii::getPathOfAlias('ext') . '/phpmailer/JPh

随机推荐