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中冒号、endif、endwhile、endfor使用介绍
Apr 28 PHP
php 中文和编码判断代码
May 16 PHP
php的SimpleXML方法读写XML接口文件实例解析
Jun 16 PHP
php将HTML表格每行每列转为数组实现采集表格数据的方法
Apr 03 PHP
thinkphp中的url跳转用法分析
Jul 12 PHP
php 变量引用与变量销毁机制详细介绍
Dec 05 PHP
Thinkphp结合ajaxFileUpload实现异步图片传输示例
Mar 13 PHP
php mysql_list_dbs()函数用法示例
Mar 29 PHP
PHP实现的简单操作SQLite数据库类与用法示例
Jun 19 PHP
ThinkPHP删除栏目(实现批量删除栏目)
Jun 21 PHP
php设计模式之建造器模式分析【星际争霸游戏案例】
Jan 23 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
Feb 15 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
WML,Apache,和 PHP 的介绍
2006/10/09 PHP
php递归json类实例
2014/12/02 PHP
PHP模拟登陆163邮箱发邮件及获取通讯录列表的方法
2015/03/07 PHP
浅谈PHP中的Trait使用方法
2019/03/22 PHP
『jQuery』名称冲突使用noConflict方法解决
2013/04/22 Javascript
javascript读写XML实现广告轮换(兼容IE、FF)
2013/08/09 Javascript
文本框回车提交与禁止提交示例
2013/09/27 Javascript
在Javascript中处理字符串之big()方法的使用
2015/06/08 Javascript
AngularJS使用指令增强标准表单元素功能
2016/07/01 Javascript
JavaScript中子对象访问父对象的方式详解
2016/09/01 Javascript
移动端使用localStorage缓存Js和css文的方法(web开发)
2016/09/20 Javascript
jQuery事件用法详解
2016/10/06 Javascript
原生js实现淘宝购物车功能
2020/06/23 Javascript
html5+canvas实现支持触屏的签名插件教程
2017/05/08 Javascript
Three.js如何实现雾化效果示例代码
2017/09/27 Javascript
JS实现图片拖拽交换效果
2018/11/30 Javascript
微信小程序webview组件交互,内联h5页面并网页实现微信支付实现解析
2019/08/16 Javascript
jquery实现手风琴案例
2020/05/04 jQuery
Node.js API详解之 vm模块用法实例分析
2020/05/27 Javascript
pydev使用wxpython找不到路径的解决方法
2013/02/10 Python
Python编程之event对象的用法实例分析
2017/03/23 Python
Python简单删除列表中相同元素的方法示例
2017/06/12 Python
Python中的二维数组实例(list与numpy.array)
2018/04/13 Python
python3+PyQt5泛型委托详解
2018/04/24 Python
tensorflow 实现打印pb模型的所有节点
2020/01/23 Python
婚礼证婚人证婚词
2014/01/13 职场文书
经典的毕业生自荐信范文
2014/04/14 职场文书
应届生面试求职信
2014/07/02 职场文书
党员干部观看《周恩来四个昼夜》思想汇报
2014/09/10 职场文书
2014年政府采购工作总结
2014/12/09 职场文书
公司承诺书格式范文
2015/04/28 职场文书
独生子女证明范本
2015/06/19 职场文书
个人更名证明
2015/06/23 职场文书
一封真诚的自荐信帮你赢得机会
2019/05/07 职场文书
解决pycharm下载库时出现Failed to install package的问题
2021/09/04 Python
Python基本知识点总结
2022/04/07 Python