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 正则匹配函数体
Aug 25 PHP
PHP分页函数代码(简单实用型)
Dec 02 PHP
解析PHP自带的进位制之间的转换函数
Jun 08 PHP
使用淘宝IP库获取用户ip地理位置
Oct 27 PHP
PHP实现将浏览历史页面网址保存到cookie的方法
Jan 26 PHP
在win系统安装配置 Memcached for PHP 5.3 图文教程
Mar 03 PHP
深入浅析yii2-gii自定义模板的方法
Apr 26 PHP
ECSHOP完美解决Deprecated: preg_replace()报错的问题
May 17 PHP
php reset() 函数指针指向数组中的第一个元素并输出实例代码
Nov 21 PHP
ThinkPHP实现生成和校验验证码功能
Apr 28 PHP
Laravel框架中Blade模板的用法示例
Aug 30 PHP
浅谈如何提高PHP代码的质量
May 28 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专用数组排序类ArraySortUtil用法实例
2015/04/03 PHP
PHP实现的注册,登录及查询用户资料功能API接口示例
2017/06/06 PHP
Laravel统一错误处理为JSON的方法介绍
2020/10/18 PHP
网页开发中的容易忽略的问题 javascript HTML中的table
2009/04/15 Javascript
js文本框输入点回车触发确定兼容IE、FF等
2013/11/19 Javascript
javascript实时显示北京时间的方法
2015/03/12 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(一)之数据支持json字符串、list集合
2016/08/11 Javascript
在html中引入外部js文件,并调用带参函数的方法
2016/10/31 Javascript
原生js实现弹出层登录拖拽功能
2016/12/05 Javascript
Bootstrap媒体对象学习使用
2017/03/07 Javascript
Vue.js bootstrap前端实现分页和排序
2017/03/10 Javascript
javaScript 连接打印机,打印小票的实例
2017/12/29 Javascript
vue实现在表格里,取每行的id的方法
2018/03/09 Javascript
详解python发送各类邮件的主要方法
2016/12/22 Python
Python cookbook(数据结构与算法)筛选及提取序列中元素的方法
2018/03/19 Python
Python实现读取Properties配置文件的方法
2018/03/29 Python
Python Xml文件添加字节属性的方法
2018/03/31 Python
读取json格式为DataFrame(可转为.csv)的实例讲解
2018/06/05 Python
Python装饰器模式定义与用法分析
2018/08/06 Python
解决python3中cv2读取中文路径的问题
2018/12/05 Python
浅谈Python中的全局锁(GIL)问题
2019/01/11 Python
在Python 字典中一键对应多个值的实例
2019/02/03 Python
python正则爬取某段子网站前20页段子(request库)过程解析
2019/08/10 Python
Django 项目布局方法(值得推荐)
2020/03/22 Python
如何编写python的daemon程序
2021/01/07 Python
设计师家具购买和委托在线市场:Viyet
2016/11/16 全球购物
大学生开西餐厅创业计划书
2014/02/01 职场文书
大学生作弊检讨书
2014/09/11 职场文书
2015年防汛工作总结
2015/05/15 职场文书
运动会观后感
2015/06/09 职场文书
行政复议答复书
2015/07/01 职场文书
幼儿园毕业致辞
2015/07/29 职场文书
社区志愿服务活动感想
2015/08/07 职场文书
在python中实现导入一个需要传参的模块
2021/05/12 Python
MySQL配置主从服务器(一主多从)
2021/08/07 MySQL
ajax请求前端跨域问题原因及解决方案
2021/10/16 Javascript