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录入页面中动态从数据库中提取数据的实现
Oct 09 PHP
php allow_url_include的应用和解释
Apr 22 PHP
调整优化您的LAMP应用程序的5种简单方法
Jun 26 PHP
joomla jce editor 解决上传中文名文件失败问题
Jun 09 PHP
php 使用file_get_contents读取大文件的方法
Nov 13 PHP
微信API接口大全
Apr 15 PHP
php结合正则获取字符串中数字
Jun 19 PHP
微信支付开发订单查询实例
Jul 12 PHP
php实现微信扫码支付
Mar 26 PHP
yii2 上传图片的示例代码
Nov 02 PHP
Laravel框架Eloquent ORM删除数据操作示例
Dec 03 PHP
通过代码实例解析PHP session工作原理
Dec 11 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
php预定义变量使用帮助(带实例)
2013/10/30 PHP
默认让页面的第一个控件选中的javascript代码
2009/12/26 Javascript
jquery的each方法使用示例分享
2014/03/25 Javascript
js简单实现竖向tab选项卡的方法
2015/05/04 Javascript
用户代理字符串userAgent可实现的四个识别
2015/09/20 Javascript
基于jQuery倒计时插件实现团购秒杀效果
2016/05/13 Javascript
javascript字符串对象常用api函数小结(连接,替换,分割,转换等)
2016/09/20 Javascript
用node和express连接mysql实现登录注册的实现代码
2017/07/05 Javascript
angularjs 缓存的使用详解
2018/03/19 Javascript
基于React+Redux的SSR实现方法
2018/07/03 Javascript
微信小程序Echarts图表组件使用方法详解
2019/06/25 Javascript
微信小程序实现点击图片放大预览
2019/10/21 Javascript
解决echarts图表使用v-show控制图表显示不全的问题
2020/07/19 Javascript
Python 代码性能优化技巧分享
2012/08/07 Python
Python中lambda的用法及其与def的区别解析
2014/07/28 Python
使用Python编写一个在Linux下实现截图分享的脚本的教程
2015/04/24 Python
Python cx_freeze打包工具处理问题思路及解决办法
2016/02/13 Python
Python3.5 创建文件的简单实例
2018/04/26 Python
python smtplib模块实现发送邮件带附件sendmail
2018/05/22 Python
Python3进制之间的转换代码实例
2019/08/24 Python
Python高级property属性用法实例分析
2019/11/19 Python
python获取array中指定元素的示例
2019/11/26 Python
详解python中groupby函数通俗易懂
2020/05/14 Python
CSS3弹性盒模型开发笔记(二)
2016/04/26 HTML / CSS
详解HTML5中download属性的应用
2015/08/06 HTML / CSS
香港家用健身器材、运动器材及健康美容仪器专门店:FitBoxx
2019/12/05 全球购物
Happy Socks英国官网:购买五颜六色的袜子
2020/11/03 全球购物
JAVA中的关键字有什么特点
2014/03/07 面试题
飞利信loadrunner和软件测试笔试题
2012/09/22 面试题
优秀的茶餐厅创业计划书
2014/01/03 职场文书
2014新年寄语
2014/01/20 职场文书
大学毕业生推荐信
2014/07/09 职场文书
土木工程专业本科生求职信
2014/10/01 职场文书
2014年敬老院工作总结
2014/12/08 职场文书
大学生预备党员自我评价
2015/03/04 职场文书
羊脂球读书笔记
2015/06/30 职场文书