php __autoload函数和命名空间。

5.3后就有了命名空间,从别人家哪里下的API发现很少有包含require,include的代码,但是却实现了所有文件的包含。

文章目录:
  1.   __autoload使用技巧。
  2.   命名空间介绍和使用。
  3.   两者结合使用优化代码。

1,__autoload使用技巧:

  原理:当有定义__autoload函数,每次创建一个类的对象就会触发该函数。

  原型:

function __autoload($classname){
    $classname=str_replace(‘\\‘,‘/‘,$classname);
    require ‘../src/‘.$classname.‘.php‘;
}

  用__autoload实现自动加载:

function __autoload($classname){
    requireAll(‘../src‘,$class_name)
}

/**
 * 搜索所有的 $dir目录下的文件,如果存在文件名为 $class_name 的文件就包含它。
 */

function requireAll($dir,$class_name){
    $d=dir($dir);
    while(false!==($entry=$d->read())){
        if($entry==‘..‘) continue;
        if($entry==‘.‘) continue;
        if(is_dir($dir.‘/‘.$entry)){
            requireAll($dir.‘/‘.$entry,$class_name);
        }else{
            if($entry==$class_name.‘.php‘){
                require_once $dir.‘/‘.$entry;
            }
        }
    }
    $d->close();
}

在目录下,无论那个层次,只要你定义了这个类,并且名字和文件名一致,你就可以创建这个类的对象。


2,命名空间介绍和使用

  命名空间是为了使类名定义不重复,不是用命名空间的代码往往为了区分一个类似功能的函数命名要多出很多字节,有时候还可能与系统定义的函数发生冲突,命名空间就是为了避免这一类事情的发生。

  命名空间规则:

  默认的是公共的命名空间,在网上截取这一段:

非限定名称,或不包含前缀的类名称,例如 $a=new foo(); 或 foo::staticmethod();。如果当前命名空间是 currentnamespace,foo 将被解析为currentnamespace\foo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,则 foo 会被解析为foo。 警告:如果命名空间中的函数或常量未定义,则该非限定的函数名称或常量名称会被解析为全局函数名称或常量名称。详情参见 使用命名空间:后备全局函数名称/常量名称。
限定名称,或包含前缀的名称,例如 $a = new subnamespace\foo(); 或 subnamespace\foo::staticmethod();。如果当前的命名空间是currentnamespace,则 foo 会被解析为 currentnamespace\subnamespace\foo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,foo 会被解析为subnamespace\foo。
完全限定名称,或包含了全局前缀操作符的名称,例如, $a = new \currentnamespace\foo(); 或 \currentnamespace\foo::staticmethod();。在这种情况下,foo 总是被解析为代码中的文字名(literal name)currentnamespace\foo

  定义多个命名空间:

namespace MyProject {

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }
}

namespace AnotherProject {

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }
}

3,两者结合使用优化代码

  其实原理很简单,当 “new foo()”的时候,会解析成 currentnamespace\foo,所以在 __autoload做一下更改就可以实现自动加载了。

  

use Wish\WishClient;
function __autoload($classname){
    $classname=str_replace(‘\\‘,‘/‘,$classname);
    require ‘../src/‘.$classname.‘.php‘;
}

/**
 * 搜索所有的 $dir目录下的文件,如果存在文件名为 $class_name 的文件就包含它。
 */

function requireAll($dir,$class_name){
    $d=dir($dir);
    while(false!==($entry=$d->read())){
        if($entry==‘..‘) continue;
        if($entry==‘.‘) continue;
        if(is_dir($dir.‘/‘.$entry)){
            requireAll($dir.‘/‘.$entry,$class_name);
        }else{
            if($entry==$class_name.‘.php‘){
                require_once $dir.‘/‘.$entry;
            }
        }
    }
    $d->close();
}

$A=new WishClient(‘‘);

  

时间: 2024-10-06 15:45:15

php __autoload函数和命名空间。的相关文章

1、php----自动加载类 __autoload()函数

1 很多开发者写面向对象的应用程序时,对每个类的定义建立一个 PHP 源文件.一个很大的烦恼是不得不在每个脚本(每个类一个文件)开头写一个长长的包含文件的列表. 2 在软件开发的系统中,不可能把所有的类都写在一个PHP文件中,当在一个PHP文件中需要调用另一个文件中声明的类时,就需要通过include把 这个文件引入.不过有的时候,在文件众多的项目中,要一一将所需类的文件都include进来,是一个很让人头疼的事,所以我们能不能在用到什么类的时 候,再把这个类所在的php文件导入呢?这就是我们这

day12函数的命名空间,作用域,闭包等

一.三元表达式 if条件成功的值    if  条件   else else条件成功的值 #if条件成立的结果 if 条件 else else条件成立的结果 # a = 20 # b = 10 # c = 5 if a>b else 10 # print(c) 二.函数的命名空间 命名空间一共分为三种: 全局命名空间 局部命名空间 内置命名空间 *内置命名空间中存放了python解释器为我们提供的名字:input,print,str,list,tuple...它们都是我们熟悉的,拿过来就可以用的

__autoload函数

./index.php----------------------------------------------------------------------------------<?php//自定义__autoload函数,当实例化一个没有加载的类时,这个函数会自动执行function __autoload($classname){ $filename = "./". $classname .".php"; include_once($filename

PHP __autoload函数知识点

__autoload函数主要是用来包含不存在的类文件,当初始化的类不存在的时候 存在一个文件名为footer.php的文件,里面有个footer类 class footer{ public function __construct(){ echo 'autoload is ok'; } } function __autoload($param){ $file = $param.'.php'; if(file_exists($file)){ require_once $file; } }//实例化

php spl_autoload_register 注册__autoload()函数 及其和autoload的对比

 在越来越多的开源项目中,看到spl_autoload_register的使用,这是一个怎样的函数,它的优点是什么,下面对这个PHP 函数进行详细介绍.   spl_autoload_register介绍 查询PHP官网 http://php.net/manual/zh/function.spl-autoload-register.php 解释如下: 将函数注册到SPL __autoload函数栈中.如果该栈中的函数尚未激活,则激活它们. 如果在你的程序中已经实现了__autoload函数,它必

【PHP面向对象(OOP)编程入门教程】23.自动加载类 __autoload()函数

很多开发者写面向对象的应用程序时,对每个类的定义建立一个 PHP 源文件.一个很大的烦恼是不得不在每个脚本(每个类一个文件)开头写一个长长的包含文件的列表. 在软件开发的系统中,不可能把所有的类都写在一个PHP文件中,当在一个PHP文件中需要调用另一个文件中声明的类时,就需要通过include把 这个文件引入.不过有的时候,在文件众多的项目中,要一一将所需类的文件都include进来,是一个很让人头疼的事,所以我们能不能在用到什么类的时 候,再把这个类所在的php文件导入呢?这就是我们这里我们要

php对象:__autoload()函数及单入口文件,__set(), __get(), get_class_methods(),get_class_vars()

__autoload():当类中找不到相关类的时候,会自动执行__autoload()函数,可以自动加载相关文件 __set() : 当对类的私有变量进行调用赋值时,自动调用该方法. __get() : 在外部获得类的私有属性时,自动调用该方法. get_class_methods(): 获取类的方法 get_class_vars(): 获取类的属性 传入类名,返回数组 私有变量外部能不能访问 来自为知笔记(Wiz)

函数的命名空间和作用域

一.函数的命名空间 命名空间:name space是从名称(name)到对象(object)上的映射. 当一个name映射到一个object上时,这个name和这个object就有了绑定(bind)关系,或者说这个name指向了这个object. 每个name只对应一个object,而一个object可有多个名字.这就是类与实例的关系. 不同的命名空间在不同的时刻被创建,并且有不同的生命周期. 内置的命名空间在python解释器启动的时候创建的,并且一直保留,不会删除. 在python程序中的任

函数_命名空间和作用域

#函数进阶----命名空间和作用域 # a = 1# def func():# print(a)# func() 调用是可以的 # def func():# a = 1## func()# print(a) 不可以的 #命名空间和作用域# print()# input()# list# tuple#命名空间有三种# 内置的命名空间--------->python解释器 #就是python解释器一启动就可以使用的名字存储在内置命名空间中 #内置的名字在启动解释器的时候被加载到内存里 # 全局命名空