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 26 PHP
php strrpos()与strripos()函数
Aug 31 PHP
php-fpm配置详解
Feb 12 PHP
php利用cookie实现自动登录的方法
Dec 10 PHP
Yii2.0预定义的别名功能小结
Jul 04 PHP
PHP身份证校验码计算方法
Aug 10 PHP
php源码 fsockopen获取网页内容实例详解
Sep 24 PHP
PHP对XML内容进行修改和删除实例代码
Oct 26 PHP
php判断str字符串是否是xml格式数据的方法示例
Jul 26 PHP
PHP实现微信商户支付企业付款到零钱功能
Sep 30 PHP
PHP实现的数据对象映射模式详解
Mar 20 PHP
PHP实现的微信APP支付功能示例【基于TP5框架】
Sep 16 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
浅析Dos下运行php.exe,出现没有找到php_mbstring.dll 错误的解决方法
2013/06/29 PHP
PHP中file_exists函数不支持中文名的解决方法
2014/07/26 PHP
jQuery 操作下拉列表框实现代码
2010/02/22 Javascript
基于JQuery的asp.net树实现代码
2010/11/30 Javascript
如何用ajax来创建一个XMLHttpRequest对象
2012/12/10 Javascript
js中opener与parent的区别详细解析
2014/01/14 Javascript
js隐式全局变量造成的bug示例代码
2014/04/22 Javascript
关于两个jQuery(js)特效冲突的bug的解决办法
2016/09/04 Javascript
聊聊JS动画库 Velocity.js的使用
2018/03/13 Javascript
使用vuepress搭建静态博客的示例代码
2019/02/14 Javascript
vue学习笔记之给组件绑定原生事件操作示例
2020/02/27 Javascript
在vue中使用jsonp进行跨域请求接口操作
2020/10/29 Javascript
python实现用于测试网站访问速率的方法
2015/05/26 Python
用Python写冒泡排序代码
2016/04/12 Python
Python实现通过文件路径获取文件hash值的方法
2017/04/29 Python
Python爬虫DOTA排行榜爬取实例(分享)
2017/06/13 Python
python+pandas+时间、日期以及时间序列处理方法
2018/07/10 Python
Python3爬虫学习之爬虫利器Beautiful Soup用法分析
2018/12/12 Python
Python HTML解析模块HTMLParser用法分析【爬虫工具】
2019/04/05 Python
python调用HEG工具批量处理MODIS数据的方法及注意事项
2020/02/18 Python
python MultipartEncoder传输zip文件实例
2020/04/07 Python
Virtualenv 搭建 Py项目运行环境的教程详解
2020/06/22 Python
python在CMD界面读取excel所有数据的示例
2020/09/28 Python
使用Python webdriver图书馆抢座自动预约的正确方法
2021/03/04 Python
使用CSS媒体查询(Media Queries)和JavaScript判断浏览器设备类型的方法
2014/04/03 HTML / CSS
css3圆角边框和边框阴影示例
2014/05/05 HTML / CSS
法国奢华女性时尚配饰网上商店:Monnier Frères
2016/08/27 全球购物
英国女性运动服品牌:Sweaty Betty
2018/11/08 全球购物
法国面料和小百货在线商店:Mondial Tissus
2019/03/23 全球购物
俄罗斯宠物用品网上商店:ZooMag
2019/12/12 全球购物
怎样有效的进行自我评价
2013/10/06 职场文书
意向书范文
2014/03/31 职场文书
教师个人工作总结范文2015
2015/10/14 职场文书
2016年119消防宣传日活动总结
2016/04/05 职场文书
再次探讨go实现无限 buffer 的 channel方法
2021/06/13 Golang
vue 数字翻牌器动态加载数据
2022/04/20 Vue.js