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 5.0对象模型深度探索之类的静态成员
Mar 27 PHP
php5中date()得出的时间为什么不是当前时间的解决方法
Jun 30 PHP
用PHP与XML联手进行网站编程代码实例
Jul 10 PHP
PHP类与对象中的private访问控制的疑问
Nov 01 PHP
ThinkPHP3.1新特性之查询条件预处理简介
Jun 19 PHP
jQuery获取json后使用zy_tmpl生成下拉菜单
Mar 27 PHP
PHP读取PPT文件的方法
Dec 10 PHP
php基于ob_start(ob_gzhandler)实现网页压缩功能的方法
Feb 18 PHP
PHP大文件分片上传的实现方法
Oct 28 PHP
PHP抽象类与接口的区别实例详解
May 09 PHP
PHP swoole和redis异步任务实现方法分析
Aug 12 PHP
php去除数组中为0的元素的实例分析
Nov 17 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
解析file_get_contents模仿浏览器头(user_agent)获取数据
2013/06/27 PHP
PHP流Streams、包装器wrapper概念与用法实例详解
2017/11/17 PHP
游戏人文件夹程序 ver 4.03
2006/07/14 Javascript
javascript 隔行换色函数代码
2010/10/24 Javascript
你必须知道的Javascript知识点之&quot;深入理解作用域链&quot;的介绍
2013/04/23 Javascript
js改变文章字体大小的实例代码
2013/11/27 Javascript
JavaScript中的异常捕捉介绍
2014/12/31 Javascript
JQuery跳出each循环的方法
2015/04/16 Javascript
简介JavaScript中toUpperCase()方法的使用
2015/06/06 Javascript
JavaScript中的Promise使用详解
2015/06/24 Javascript
AngularJS  $modal弹出框实例代码
2016/08/24 Javascript
jQuery实现页面滚动时智能浮动定位
2017/01/08 Javascript
angular实现IM聊天图片发送实例
2017/05/08 Javascript
解决vue中使用Axios调用接口时出现的ie数据处理问题
2018/08/13 Javascript
详解vue 项目白屏解决方案
2018/10/31 Javascript
vue+element 实现商城主题开发的示例代码
2020/03/26 Javascript
[00:43]拉比克至宝魔导师密钥展示
2018/12/20 DOTA
Python json模块dumps、loads操作示例
2018/09/06 Python
深入了解和应用Python 装饰器 @decorator
2019/04/02 Python
PyQt5实现QLineEdit添加clicked信号的方法
2019/06/25 Python
详解centos7+django+python3+mysql+阿里云部署项目全流程
2019/11/15 Python
python中有关时间日期格式转换问题
2019/12/25 Python
美国女鞋品牌:naturalizer(娜然)
2016/08/01 全球购物
澳大利亚先进的皮肤和激光诊所购物网站:Soho Skincare
2018/10/15 全球购物
法国设计制造的扫帚和刷子:Andrée Jardin
2018/12/06 全球购物
意大利珠宝店:Luxury Zone
2019/01/05 全球购物
工程师自我评价怎么写
2013/09/19 职场文书
标准毕业生自荐信范文
2013/11/04 职场文书
运动会入场词50字
2014/02/20 职场文书
经典而简洁的婚礼主持词
2014/03/13 职场文书
写给医生的感谢信
2015/01/22 职场文书
学校远程教育工作总结
2015/08/11 职场文书
新手,如何业余时间安排好写作、提高写作能力?
2019/10/21 职场文书
SpringBoot实现异步事件驱动的方法
2021/06/28 Java/Android
python百行代码实现汉服圈图片爬取
2021/11/23 Python
css让页脚保持在底部位置的四种方案
2022/07/23 HTML / CSS