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


Posted in PHP onDecember 02, 2016

本文实例讲述了PHP面向对象程序设计之命名空间与自动加载类。分享给大家供大家参考,具体如下:

命名空间

避免类名重复,而产生错误。

<?php
require_once "useful/Outputter.php";
class Outputter {
  // output data
  private $name;
  public function setName($name) {
    $this->name = $name;
  }
  public function getName() {
    return $this->name;
  }
}
$obj = new Outputter(); // 同一命名空间下,类名不能相同,默认命名空间为空。空也是一种命名空间。
$obj -> setName("Jack");
print $obj->getName();
//namespace useful; // 更改命名空间,否则查询不到Hello类,Fatal error: Class 'my\Hello' not found
$hello = new Hello();
?>
<?php
// useful/Outputter.php
namespace useful; // 命名空间
class Outputter {
  //
}
class Hello {
}
?>

如何调用命名空间中的类

<?php
namespace com\getinstance\util;
class Debug {
  static function helloWorld() {
    print "hello from Debug\n";
  }
}
namespace main;
// com\getinstance\util\Debug::helloWorld(); // 找不到Debug类
\com\getinstance\util\Debug::helloWorld(); // 加斜杠之后,就从根部去寻找了。
// outPut:hello from Debug
?>

使用use关键字

<?php
namespace com\getinstance\util;
class Debug {
  static function helloWorld() {
    print "hello from Debug\n";
  }
}
namespace main;
use com\getinstance\util;
//Debug::helloWorld(); //Fatal error: Class 'main\Debug' not found
util\Debug::helloWorld();
?>

使用下面的处理,直接可以调用类

<?php
namespace com\getinstance\util;
class Debug {
  static function helloWorld() {
    print "hello from Debug\n";
  }
}
namespace main;
use com\getinstance\util\Debug; // 直接使用到类
Debug::helloWorld();
?>

\表示全局

global.php

<?php
// no namespace
class Lister {
  public static function helloWorld() {
    print "hello from global\n";
  }
}
?>
<?php
namespace com\getinstance\util;
require_once 'global.php';
class Lister {
  public static function helloWorld() {
    print "hello from ".__NAMESPACE__."\n"; // __NAMESPACE__当前namespace
  }
}
Lister::helloWorld(); // access local
\Lister::helloWorld(); // access global
?>

输出:

hello from com\getinstance\util
hello from global

命名空间加{}

<?php
namespace com\getinstance\util {
  class Debug {
    static function helloWorld() {
      print "hello from Debug\n";
    }
  }
}
namespace main {
  \com\getinstance\util\Debug::helloWorld();
}
?>

output:

hello from Debug

全局命名空间

<?php
namespace { // 全局空间
  class Lister {
    public static function helloWorld() {
      print "hello from global\n";
    }
  }
}
namespace com\getinstance\util {
  class Lister {
    public static function helloWorld() {
      print "hello from ".__NAMESPACE__."\n";
    }
  }
  Lister::helloWorld(); // access local
  \Lister::helloWorld(); // access global
}
?>

__autoload 自动加载类

ShopProduct.php

<?php
class ShopProduct {
  function __construct() {
    print "ShopProduct constructor\n";
  }
}
?>
<?php
function __autoload( $classname ) { // 自动加载,根据类名加载类
  include_once( "$classname.php" );
}
$product = new ShopProduct( 'The Darkening', 'Harry', 'Hunter', 12.99 );
?>

output:

ShopProduct constructor

进一步优化处理

位于文件夹business/ShopProduct.php

<?php
class business_ShopProduct { // 这里的类命名就要遵循规则了
  function __construct() {
    print "business_ShopProduct constructor\n";
  }
}
?>
<?php
function __autoload( $classname ) {
  $path = str_replace('_', DIRECTORY_SEPARATOR, $classname ); // 智能化处理
  require_once( "$path.php" );
}
$x = new ShopProduct();
$y = new business_ShopProduct();
?>

output:

ShopProduct constructor
business_ShopProduct constructor

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

PHP 相关文章推荐
PHP编程中八种常见的文件操作方式
Nov 19 PHP
PHP中的cookie
Nov 26 PHP
PHP+MySQL投票系统的设计和实现分享
Sep 23 PHP
thinkphp路由规则使用示例详解和伪静态功能实现(apache重写)
Feb 24 PHP
自编函数解决pathinfo()函数处理中文问题
Nov 03 PHP
CI框架源码解读之URI.php中_fetch_uri_string()函数用法分析
May 18 PHP
php错误日志简单配置方法
Jul 11 PHP
php强制下载文件函数
Aug 24 PHP
thinkphp整合微信支付代码分享
Nov 24 PHP
php 浮点数比较方法详解
May 05 PHP
基于Laravel实现的用户动态模块开发
Sep 21 PHP
php7性能提升的原因详解
Oct 13 PHP
PHP面向对象程序设计之类与反射API详解
Dec 02 #PHP
PHP面向对象程序设计之对象生成方法详解
Dec 02 #PHP
PHP面向对象程序设计组合模式与装饰模式详解
Dec 02 #PHP
PHP与jquery实时显示网站在线人数实例详解
Dec 02 #PHP
谈谈php对接芝麻信用踩的坑
Dec 01 #PHP
PHP自定义函数获取汉字首字母的方法
Dec 01 #PHP
phpmailer绑定邮箱的实现方法
Dec 01 #PHP
You might like
jQuery 性能优化指南 (1)
2009/05/21 Javascript
jquery tab插件制作实现代码
2010/06/22 Javascript
下载文件个别浏览器文件名乱码解决办法
2013/03/19 Javascript
JS动态创建Table,Tr,Td并赋值的具体实现
2013/07/05 Javascript
通过js简单实现将一个文本内容转译成加密文本
2013/10/22 Javascript
JS连连看源码完美注释版(推荐)
2013/12/09 Javascript
我的Node.js学习之路(一)
2014/07/06 Javascript
超级简单的jquery操作表格方法
2014/12/15 Javascript
jquery动态导航插件dynamicNav用法实例分析
2015/09/06 Javascript
AngularJS控制器继承自另一控制器
2016/05/09 Javascript
xtemplate node.js 的使用方法实例解析
2016/08/22 Javascript
JavaScript设计模式之单体模式全面解析
2016/09/09 Javascript
jQuery中$.grep() 过滤函数 数组过滤
2016/11/22 Javascript
Vue.use源码分析
2017/04/22 Javascript
Ajax高级笔记 JavaScript高级程序设计笔记
2017/06/22 Javascript
AngularJS 的$timeout服务示例代码
2017/09/21 Javascript
JavaScript求一组数的最小公倍数和最大公约数常用算法详解【面向对象,回归迭代和循环】
2018/05/07 Javascript
Vue实现美团app的影院推荐选座功能【推荐】
2018/08/29 Javascript
[51:11]2014 DOTA2国际邀请赛中国区预选赛5.21 LGD-CDEC VS DT
2014/05/22 DOTA
[59:35]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第二局
2016/03/04 DOTA
[01:21]DOTA2周边文化主题展 神秘商店火热开售
2017/07/30 DOTA
使用Python抓取模板之家的CSS模板
2015/03/16 Python
微信跳一跳python辅助软件思路及图像识别源码解析
2018/01/04 Python
分数霸榜! python助你微信跳一跳拿高分
2018/01/08 Python
Python实现识别手写数字 简易图片存储管理系统
2018/01/29 Python
[原创]Python入门教程4. 元组基本操作
2018/10/31 Python
浅谈pycharm出现卡顿的解决方法
2018/12/03 Python
Scrapy框架基本命令与settings.py设置
2020/02/06 Python
使用OpenCV去除面积较小的连通域
2020/07/05 Python
System.Array.CopyTo()和System.Array.Clone()有什么区别
2016/06/20 面试题
大学本科毕业生的自我鉴定
2013/11/26 职场文书
五年级英语教学反思
2014/01/31 职场文书
爱国主义教育基地观后感
2015/06/18 职场文书
Pyqt5将多个类组合在一个界面显示的完整示例
2021/09/04 Python
Python基础 括号()[]{}的详解
2021/11/07 Python
Apache Linkis 中间件架构及快速安装步骤
2022/03/16 Servers