这篇文章的目的是记录

  1. php中的自动加载函数 __autoload(), 和 spl_autoload_register()函数,

  2 .php中命名空间的使用。

一、当不使用命名空间的时候

  a.php

<?php
//namespace A; const test='Atest';
function test(){
return __FUNCTION__;
}
class Test
{
public function __construct(){
return __METHOD__;
}
}

  b.php

<?php
//namespace B;
//use A as aaa;
const btest='Btest';
function __autoload($a){
include_once './a.php';
}
//spl_autoload_register('load'); function btest(){
return __FUNCTION__;
}
class BTest
{
public static function load(){
include_once './a.php';
} public function __construct(){
return __METHOD__;
}
}
$a = new Test();
var_dump($a);
//include_once 'a.php';
//spl_autoload_register(array('\B\Test','load'));
//$a = new aaa\Test();
//var_dump($a);

在b.php 中 $a = new Test()时, 会自动调用__autoload()函数,include a.php文件进来,这样就可以实例化Test类成功!!

在这种情况下, 通过

spl_autoload_register('load');
这种方式也是可以实现自动调用 load()函数,从而实现include a.php文件的,这两种方式差不多。这个时候的b.php文件如下:
<?php
//namespace B;
//use A as aaa;
const btest='Btest';
function load($a){
include_once './a.php';
}
spl_autoload_register('load'); function btest(){
return __FUNCTION__;
}
class BTest
{
public static function load(){
include_once './a.php';
} public function __construct(){
return __METHOD__;
}
}
$a = new Test();
var_dump($a);
//include_once 'a.php';
//spl_autoload_register(array('\B\Test','load'));
//$a = new aaa\Test();
//var_dump($a);

二、使用命名空间的情况:

  a.php

<?php
namespace A; const test='Atest';
function test(){
return __FUNCTION__;
}
class Test
{
public function __construct(){
return __METHOD__;
}
}

  b.php

<?php
namespace B;
use A as aaa;
const btest='Btest';
function load(){
include_once './a.php';
}
spl_autoload_register('B\load'); function btest(){
return __FUNCTION__;
}
class BTest
{
public static function load(){
include_once './a.php';
} public function __construct(){
return __METHOD__;
}
}
$a = new aaa\Test();
var_dump($a);
//include_once 'a.php';
//spl_autoload_register(array('\B\Test','load'));
//$a = new aaa\Test();
//var_dump($a);

  b.php也可以改成下面这样,注册一个类中的方法为 “自动加载方法”

<?php
namespace B;
use A as aaa;
const btest='Btest';
spl_autoload_register(array('B\BTest', 'load')); function btest(){
return __FUNCTION__;
}
class BTest
{
public static function load(){
include_once './a.php';
} public function __construct(){
return __METHOD__;
}
}
$a = new aaa\Test();
var_dump($a);
//include_once 'a.php';
//spl_autoload_register(array('\B\Test','load'));
//$a = new aaa\Test();
//var_dump($a);

特别注意,当使用了命名空间后, 原来全局的__autoload()函数现在不会自动调用了,也就是说,下面的b.php是不会骑作用的,也是报错

    Fatal error: Class 'A\Test' not found in D:\wnmp\www\shine_orm\Test\b.php on line 22

<?php
namespace B;
use A as aaa;
const btest='Btest'; function btest(){
return __FUNCTION__;
}
function __autoload($aad){
include_once './a.php';
}
//spl_autoload_register('B\__autoload');
class BTest
{ public function __construct(){ return __METHOD__;
}
}
$a = new aaa\Test();
var_dump($a);
//include_once 'a.php';
//spl_autoload_register(array('\B\Test','load'));
//$a = new aaa\Test();
//var_dump($a);

必须手动将__autoload()函数注册才可以。。(也就是将 //spl_autoload_register('B\__autoload'))这一行的注释去掉才可以。下面是修改后的b.php

<?php
namespace B;
use A as aaa;
const btest='Btest'; function btest(){
return __FUNCTION__;
}
function __autoload($aad){
include_once './a.php';
}
spl_autoload_register('B\__autoload');
class BTest
{ public function __construct(){ return __METHOD__;
}
}
$a = new aaa\Test();
var_dump($a);
//include_once 'a.php';
//spl_autoload_register(array('\B\Test','load'));
//$a = new aaa\Test();
//var_dump($a);

下面这段话是别人总结的,随手拿过来用吧:

自动加载
第一段:
每个文件既要申明命名控件又要手动 include 是非常不智能的事情,所以在自己的PHP系统或者框架中可以使用自动加载技术,让系统自己去找 最简单的方式是利用函数 __autoload 函数,但是这个函数只能在非命名控件下定义,也就是全局情况下: function __autoload($class) {
$dir = ’./’;
set_include_path(get_include_path().PATH_SEPARATOR.$ids_dir);
$class = str_replace(’\’, ’/’, $class) . ’.php’;
require_once($class); }
如果在已经有了命名空间的类中,可以使用函数 spl_autoload_register 来注册一个类中的方法来代替 __autoload 第二段:
命名空间的作用:
假设如果不使用 php命名空间 namespace,那么每个类在一个项目中的名字就必须是固定的。因为php在new的时候不管是调用autoload还是调用已加载过的类,都存在一个类名对应的文件。所以在没有php命名空间namespace的时候,我们会想各种命名规则来区分不同的类,比如project1_school1_class1_Student或者project2_school_class_Student。 引入php namespace 之后就可以将这个有效规避了,一个namespace就相当于对应一个文件路径,查找这个类的时候,就会去对应的文件路径查找类定义文件了。 php命名空间↑
什么是php命名空间呢? 命名空间(英语:Namespace)表示标识符(identifier)的可见范围。一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。这样,在一个新的命名空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其它命名空间中。
简单说来命名空间 是为了解决不同库在同一个环境下使用时出现的命名冲突。例如我自己有一个函数名叫A,但是系统已经有一个A函数了,那就会出现冲突

  

PHP 命名空间以及自动加载(自动调用的函数,来include文件)的更多相关文章

  1. php自动加载的两个函数__autoload和__sql_autoload_register

    一.__autoload 这是一个自动加载函数,在PHP5中,当我们实例化一个未定义的类时,就会触发此函数.看下面例子: printit.class.php //文件 <?php class P ...

  2. 010.CI4框架CodeIgniter, autoload自动加载自己的helper函数类

    01.自己定义了一个helper类,里面有个函数用来输出 02.定义一个Controller基本类,我们以后用到的Controllers类都继承自这个类.其中自动加载helper函数如图所示: 03. ...

  3. composer的autoload来自动加载自己编写的函数库与类库?

    1.使用命令composer init生成composer.json文件,并编辑autoload选项内容如下: 其中又包含主要的两个选项: files 和 psr-4. files就是需要compos ...

  4. 常用js,css文件统一加载方法,并在加载之后调用回调函数

    原创内容,转载请注明出处! 为了方便资源管理和提升工作效率,常用的js和css文件的加载应该放在一个统一文件里面完成,也方便后续的资源维护.所以我用js写了以下方法,存放在“sourceControl ...

  5. 页面加载时调用js函数方法

    方法一:在html的body中加入onload=""事件 <body onload='queryServer()'> </body> 方法二:jquery ...

  6. PHP 命名空间与自动加载机制

    include 和 require 是PHP中引入文件的两个基本方法.在小规模开发中直接使用 include 和 require 没哟什么不妥,但在大型项目中会造成大量的 include 和 requ ...

  7. PHP 命名空间与自动加载机制介绍

    include 和 require 是PHP中引入文件的两个基本方法.在小规模开发中直接使用 include 和 require 没哟什么不妥,但在大型项目中会造成大量的 include 和 requ ...

  8. 浅析PHP类的自动加载和命名空间

    php是使用require(require_once)和include(include_once)关键字加载类文件.但是在实际的开发工程中我们基本上不会去使用这些关键字去加载类. 因为这样做会使得代码 ...

  9. PHP自动加载__autoload的工作机制

    PHP自动加载__autoload的工作机制 PHP的懒加载lazy loading 在 2011年11月12日 那天写的     已经有 4559 次阅读了 感谢 参考或原文   服务器君一共花费了 ...

  10. 说说PHP的autoLoad自动加载机制

    __autoload的使用方法1: 最经常使用的就是这种方法,根据类名,找出类文件,然后require_one 复制代码 代码如下:function __autoload($class_name) { ...

随机推荐

  1. bat自动创建文件夹(以当前时间命名)

    先cmd中查看当前的日期和时间: @echo off color 0a set dt=%date%%time% echo %dt%pause 1.使用截取进行命名(时间为12小时制时命名会出现空格,不 ...

  2. JQuery中常用方法备忘

    本文转载自博客园,原文地址 http://www.cnblogs.com/xzf158/archive/2008/10/14/logan.html 1.Window.onload 的JQuery方法 ...

  3. org.hibernate.exception.JDBCConnectionException: could not execute query

    最近在做一个项目,测试的时候是没有问题的,但是放到服务器上以后,第二天就会出现下面的异常.重启Tomcat服务器后就正常了,但是下一天还是会出现同样的异常..... 我就查了一些资料最终把问题给解决了 ...

  4. sublime Text 常用操作

    原文出处:http://www.php100.com/html/it/focus/2014/1030/7666.html 1. 多光标操作:只要按下Cmd(Windows系统下Ctrl)键,再用鼠标选 ...

  5. shell中exec解析

    参考:<linux命令.编辑器与shell编程> <unix环境高级编程> exec和source都属于bash内部命令(builtins commands),在bash下输入 ...

  6. Qt Creator下载和安装(详细教程)

    简介 Qt是跨平台的图形开发库,目前由Digia全资子公司 Qt Company 独立运营,官方网址: http://www.qt.io/ 也可以访问Qt项目域名:http://qt-project. ...

  7. 启动apache服务时报错【the requested operation has failed】

    想要解决错误,首先要找到错误的原因. 使用ApacheMonitor.exe启动apache服务看不到任何错误的原因. 找到问题原因:cmd--命令端--切换到apache的bin目录,执行如下命令: ...

  8. KVM 基本硬件容量扩容

    在工作当中如果虚拟机的容量不够使用 如何添加呢? CPU添加 cpu添加有两种方式: 1 创建虚拟机的时候可以添加 # virt-install --help | grep cpu --vcpus=V ...

  9. byte数组如何转为short数组 (转)

    最近在搞毕业设计,做的是有关语音识别的手机应用.在处理音频的过程中,发现需要用short数组处理音频,可能光用byte会越界.但是java读文件没有一次性读到short数组中的api,要么是一个一个读 ...

  10. 【纯欧拉函数】 poj 2407

    #include <cstdio> #include <iostream> using namespace std; int phi(int x) { int t=x; ;i& ...