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中的日期处理方法集锦
Jan 02 PHP
如何利用php array_multisort函数 对数据库结果进行复杂排序
Jun 08 PHP
解析如何在PHP下载文件名中解决乱码的问题
Jun 20 PHP
浅析php面向对象public private protected 访问修饰符
Jun 30 PHP
php函数serialize()与unserialize()用法实例
Nov 06 PHP
php操作xml入门之cdata区段
Jan 23 PHP
php简单实现短网址(短链)还原的方法(测试可用)
May 09 PHP
针对多用户实现头像上传功能PHP代码 适用于登陆页面制作
Aug 17 PHP
php 微信公众平台开发模式实现多客服的实例代码
Nov 07 PHP
Laravel 集成 Geetest验证码的方法
May 14 PHP
PHP count_chars()函数讲解
Feb 14 PHP
laravel orm 关联条件查询代码
Oct 21 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获取文本框、密码域、按钮的值实例代码
2017/04/19 PHP
PHP超低内存遍历目录文件和读取超大文件的方法
2019/05/01 PHP
PHP getID3类的使用方法学习笔记【附getID3源码下载】
2019/10/18 PHP
用jQuery扩展自写的 UI导航
2010/01/13 Javascript
基于jquery插件实现常见的幻灯片效果
2013/11/01 Javascript
Javascript call和apply区别及使用方法
2013/11/14 Javascript
JavaScript表单验证实例之验证表单项是否为空
2016/01/10 Javascript
学习JavaScript设计模式之享元模式
2016/01/18 Javascript
浅析JSONP技术原理及实现
2016/06/08 Javascript
分享JS代码实现鼠标放在输入框上输入框和图片同时更换样式
2016/09/01 Javascript
JavaScript实现审核流程状态的动态显示进度条
2017/03/15 Javascript
浅谈react.js 之 批量添加与删除功能
2017/04/17 Javascript
详解html-webpack-plugin插件(用法总结)
2018/09/12 Javascript
微信小程序实现九宫格抽奖
2020/04/15 Javascript
JavaScript函数式编程(Functional Programming)高阶函数(Higher order functions)用法分析
2019/05/22 Javascript
开发Node CLI构建微信小程序脚手架的示例
2020/03/27 Javascript
vue使用Sass时报错问题的解决方法
2020/10/14 Javascript
vue 使用class创建和清除水印的示例代码
2020/12/25 Vue.js
[00:57]深扒TI7聊天轮盘语音出处5
2017/05/11 DOTA
Python 读取图片文件为矩阵和保存矩阵为图片的方法
2018/04/27 Python
python爬虫获取小区经纬度以及结构化地址
2018/12/30 Python
用Python将结果保存为xlsx的方法
2019/01/28 Python
啥是佩奇?使用Python自动绘画小猪佩奇的代码实例
2019/02/20 Python
Django在pycharm下修改默认启动端口的方法
2019/07/26 Python
Django xadmin开启搜索功能的实现
2019/11/15 Python
纯CSS3实现的8种Loading动画效果
2014/07/05 HTML / CSS
WebSphere面试题:在WebSphere里面如何部署一个应用
2015/08/02 面试题
服务员岗位责任制
2014/02/11 职场文书
弘扬民族精神演讲稿
2014/05/07 职场文书
简单租房协议书范本
2014/08/20 职场文书
夫妻分居协议书范本(有子女版)
2014/11/01 职场文书
三峡导游词
2015/01/31 职场文书
惊天动地观后感
2015/06/10 职场文书
警示教育片观后感
2015/06/17 职场文书
mysql 如何获取两个集合的交集/差集/并集
2021/06/08 MySQL
JavaScript前端面试组合函数
2022/06/21 Javascript