设为首页 收藏本站
查看: 954|回复: 0

[经验分享] PHP中的use、命名空间、引入类文件、自动加载类的理解

[复制链接]

尚未签到

发表于 2017-12-30 14:53:25 | 显示全部楼层 |阅读模式
  use只是使用了命名空间,
  但是要想调用类,必须要加载类文件,或者自动加载。
DSC0000.png

DSC0001.png

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

DSC0003.png

  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();
  

DSC0004.png

  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类库包目录
  │ ├─ ... 更多类库目录
  所以,如果有命名空间,不需要引入文件也可以。
  但是没有命名空间的类,如果不引入文件,就会报错。
DSC0005.png

DSC0006.png

DSC0007.png

  import一下就可以了,
DSC0008.png

DSC0009.png

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

printit.class.php  

<?php  

class PRINTIT {function doPrint() {echo 'hello world';  }
  
}
  

?>  
index
.php  

<?  
function __autoload( $class ) {
  $file = $class . '.class.php';
  if ( ($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 (($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 (($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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-429710-1-1.html 上篇帖子: Linux环境下安装PHP的gd库 下篇帖子: PHP的laravel框架后台实现数据导出excel的功能
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表