PHP中的use、命名空间、引入类文件、自动加载类的理解

use只是使用了命名空间,
但是要想调用类,必须要加载类文件,或者自动加载。

即便是引入了其中一个类,如果没有自动加载机制,还是会报错

use的几种用法

namespace Blog\Article;
class Comment { }

//创建一个BBS空间(我有打算开个论坛)
namespace BBS;

//导入一个命名空间
use Blog\Article;
//导入命名空间后可使用限定名称调用元素
$article_comment = new Article\Comment();

//为命名空间使用别名
use Blog\Article as Arte;
//使用别名代替空间名
$article_comment = new Arte\Comment();

//导入一个类
use Blog\Article\Comment;
//导入类后可使用非限定名称调用元素
$article_comment = new Comment();

//为类使用别名
use Blog\Article\Comment as Comt;
//使用别名代替空间名
$article_comment = new Comt();

1.第一种引入方式(前提是有了自动加载机制)

use OSS\OssClient; // 表示引入Class ‘OSS\OssClient‘

使用的时候,

$ossClient = new OSS\OssClient($accessKeyId, $accessKeySecret, $endpoint, false);

或者这样

$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false);

都可以!

2.第二种引入方式(前提是有了自动加载机制)

import(‘@.ORG.OSS.OssClient‘); // thinkphp中的加载机制

使用的时候,只能

$ossClient = new OSS\OssClient($accessKeyId, $accessKeySecret, $endpoint, false);  // 其中OSS是命名空间

thinkphp中有一种自动加载命名空间的机制,

框架Liberary目录下的命名空间都可以自动识别和定位,如下

Library 框架类库目录
│ ├─Think 核心Think类库包目录
│ ├─Org Org类库包目录
│ ├─ ... 更多类库目录

所以,如果有命名空间,不需要引入文件也可以。
但是没有命名空间的类,如果不引入文件,就会报错。

import一下就可以了,

3.__autoload

这是一个自动加载函数,在PHP5中,当我们实例化一个未定义的类时,就会触发此函数。看下面例子:

printit.class.php 

<?php 

class PRINTIT { 

 function doPrint() {
  echo ‘hello world‘;
 }
}
?> 

index.php 

<?
function __autoload( $class ) {
 $file = $class . ‘.class.php‘;
 if ( is_file($file) ) {
  require_once($file);
 }
} 

$obj = new PRINTIT();
$obj->doPrint();
?>

运行index.php后正常输出hello world。在index.php中,由于没有包含printit.class.php,在实例化printit时,自动调用__autoload函数,参数$class的值即为类名printit,此时printit.class.php就被引进来了。

4.spl_autoload_register
再看spl_autoload_register(),这个函数与__autoload有与曲同工之妙,看个简单的例子:

<?
function loadprint( $class ) {
 $file = $class . ‘.class.php‘;
 if (is_file($file)) {
  require_once($file);
 }
} 

spl_autoload_register( ‘loadprint‘ ); 

$obj = new PRINTIT();
$obj->doPrint();
?>

将__autoload换成loadprint函数。但是loadprint不会像__autoload自动触发,这时spl_autoload_register()就起作用了,它告诉PHP碰到没有定义的类就执行loadprint()。

spl_autoload_register() 调用静态方法 ,

<? 

class test {
 public static function loadprint( $class ) {
  $file = $class . ‘.class.php‘;
  if (is_file($file)) {
   require_once($file);
  }
 }
} 

spl_autoload_register(  array(‘test‘,‘loadprint‘)  );
//另一种写法:spl_autoload_register(  "test::loadprint"  ); 

$obj = new PRINTIT();
$obj->doPrint();
?>

原文www.cnblogs.com/jiqing9006/p/5406994.html

时间: 2024-08-08 05:19:37

PHP中的use、命名空间、引入类文件、自动加载类的理解的相关文章

PHP的类文件自动加载机制

搜集于网络,学习php的类的自动加载机制,在实际大型项目中其重要性尤为突出. PHP的类自动加载机制 在PHP开发过程中,如果希望从外部引入一个class,通常会使用include和require方法,去把定义这个class的文件包含进来.这个在小规模开发的时候,没什么大问题.但在大型的开发项目中,这么做会产生大量的require或者include方法调用,这样不因降低效率,而且使得代码难以维护,况且require_once的代价很大. 在PHP5之前,各个PHP框架如果要实现类的自动加载,一般

__autoload() 类文件自动加载函数

这个魔术方法是用来自动加载程序所用到类文件的PHP源文件,这样就避免了我们一个一个自动去require或者include了,这个函数会在试图使用尚未被定义的类时自动调用.通过调用此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类,但是我最近看过一篇文章,上面说__autoload()的效率不是很高.以下是示例代码: 1 <?php 2 功能:在当前页使用类时自动加载该类的文件 3 参数$className 为类的名称 可自定义 4 5 */ 6 7 function __auto

final,类的自动加载,命名空间

final是干什么的一般是为了防止父类的一个方法被重写如果父类中的方法被声明为 final,则子类无法覆盖该方法.如果一个类被声明为 final,则不能被继承. Note: 属性不能被定义为 final,只有类和方法才能被定义为 final. 类的自动加载类的自动加载是指,在外面的页面中,并不需要去"引入"类文件,但是程序会在需要的时候动态加载需要的类文件. spl_autoload_register() 函数可以注册任意数量的自动加载器,当使用尚未被定义的类(class)和接口(in

PHP的 Final关键字、类(文件)的加载和命名空间

** Final.类(文件)的加载和命名空间 1.final 关键字-----终态的.最终的 final 关键字用于修饰类和方法:修饰的类不能被继承,修饰的函数方法(public)在子类中不能被重载. 如果父类中的方法被声明为 final,则子类无法覆盖该方法.如果一个类被声明为 final,则不能被继承. 类使用 final 关键字的例子: final class Person{ ...... } final 定义的类被继承时会提示如下错误: Fatal error: Class Studen

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

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

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

php是使用require(require_once)和include(include_once)关键字加载类文件.但是在实际的开发工程中我们基本上不会去使用这些关键字去加载类. 因为这样做会使得代码的维护相当的困难.实际的开发中我们会在文件的开始位置用use关键字使用类,然后直接new这个类就可以了. 至于类是怎么加载的,一般都是框架或者composer去实现的. <?php use Illuminate\Container\Container; $container = new Contai

自动加载类PHP中spl_autoload_register函数的用法

spl_autoload_register(PHP 5 >= 5.1.2) spl_autoload_register — 注册__autoload()函数 说明bool spl_autoload_register ([ callback $autoload_function ] )将函数注册到SPL __autoload函数栈中.如果该栈中的函数尚未激活,则激活它们. 如果在你的程序中已经实现了__autoload函数,它必须显式注册到__autoload栈中.因为 spl_autoload_

面向对象之final,类的自动加载,命名空间

Final关键字:最终的属性不能被定义为 final,只有类和方法才能被定义为 final.特点:Final类不能被继承: 如果我们不希望一个类被继承,我们使用final来修饰这个类.这个类将无法被继承.比如我们设定的Math类,涉及了我们要做的数学计算方法,这些算法也没有必要修改,也没有必要被继承,我们把它设置成final类型.Final 方法不能被重写:如果不希望类中的某个方法被子类重写,我们可以设置这个方法为final方法,只需要在这个方法前加上final修饰符类的自动加载简化开发者书写文

final关键字,类的自动加载,命名空间

final关键字 1.final可以修饰方法和类,但是不能修饰属性: 2.Final修饰的类不能被继承: 3.Fina修饰的方法不能被重写,子类可以对已被final修饰的父类进行访问,但是不能对父类的方法进行重写. 扩展内容: 类的自动加载: 什么是类的自动加载? Spl_autoload_register():注册给定的函数作为__autoload()函数的实现 类的自动加载 在最开始使用的是__autoload()进行自动加载,但是在PHP5.3之前,__autoload函数抛出的异常不能被

php中自动加载类_autoload()和spl_autoload_register()实例详解

一._autoload 自动加载类:当我们实例化一个未定义的类时,就会触此函数.到了php7.1以后版本不支持此函数好像抛弃了 新建一个类文件名字自己随便去:news类在auto.php文件里面去实例news类而没有引入该类,可以用_autoload自动加载方法类去处理. news.class.php文件 class news{ function do_new() { echo 'aaa'; } } auto.php文件使用_autoload函数要定义函数体自己去定义 function __au