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下通过file_get_contents的代理使用方法
Feb 16 PHP
深入解析php中的foreach问题
Jun 30 PHP
PHP中include与require使用方法区别详解
Oct 19 PHP
PHP5.3安装Zend Guard Loader图文教程
Sep 29 PHP
php中运用http调用的GET和POST方法示例
Sep 29 PHP
smarty内置函数{loteral}、{ldelim}和{rdelim}用法实例
Jan 22 PHP
Laravel 5框架学习之表单
Apr 08 PHP
PHP+Mysql+jQuery中国地图区域数据统计实例讲解
Oct 10 PHP
php 判断字符串编码是utf-8 或gb2312实例
Nov 01 PHP
php删除数组指定元素实现代码
May 03 PHP
Laravel事件监听器用法实例分析
Mar 12 PHP
php的lavarel框架中join和orWhere的用法
Dec 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 如何利用phpexcel导入数据库
2013/08/24 PHP
使用Discuz关键词服务器实现PHP中文分词
2014/03/11 PHP
php中cookie的使用方法
2014/03/29 PHP
ThinkPHP模板引擎之导入资源文件方法详解
2014/06/18 PHP
PHP共享内存使用与信号控制实例分析
2018/05/09 PHP
thinkPHP3.2.3实现阿里大于短信验证的方法
2018/06/06 PHP
js中eval()函数和trim()去掉字符串左右空格应用
2013/02/02 Javascript
深入理解JavaScript中的传值与传引用
2013/12/09 Javascript
JS 日期比较大小的简单实例
2014/01/13 Javascript
JavaScript里四舍五入函数round用法实例
2015/04/06 Javascript
jQuery的基本概念与高级编程
2015/05/14 Javascript
浅谈JavaScript对象的创建方式
2016/06/13 Javascript
js改变html的原有内容实现方法
2016/10/05 Javascript
jQuery EasyUI结合zTree树形结构制作web页面
2017/09/01 jQuery
五步轻松实现JavaScript HTML时钟效果
2020/03/25 Javascript
js纯前端实现腾讯cos文件上传功能的示例代码
2019/05/14 Javascript
vue(2.x,3.0)配置跨域代理
2019/11/27 Javascript
Vue实现图片与文字混输效果
2019/12/04 Javascript
使用webpack搭建vue环境的教程详解
2019/12/31 Javascript
Vue如何使用混合Mixins和插件开发详解
2020/02/05 Javascript
vue实现在进行增删改操作后刷新页面
2020/08/05 Javascript
老生常谈Python startswith()函数与endswith函数
2017/09/08 Python
python操作MySQL 模拟简单银行转账操作
2017/09/27 Python
Python matplotlib画图实例之绘制拥有彩条的图表
2017/12/28 Python
python3读取csv和xlsx文件的实例
2018/06/22 Python
Pytorch使用MNIST数据集实现基础GAN和DCGAN详解
2020/01/10 Python
解决Jupyter notebook更换主题工具栏被隐藏及添加目录生成插件问题
2020/04/20 Python
详解CSS3的box-shadow属性制作边框阴影效果的方法
2016/05/10 HTML / CSS
成人毕业生自我鉴定
2013/10/18 职场文书
大学生表扬信范文
2014/01/09 职场文书
自行车租赁公司创业计划书
2014/01/28 职场文书
员工培训协议书
2014/09/15 职场文书
小学秋季运动会报道稿
2014/09/30 职场文书
银行授权委托书格式
2014/10/10 职场文书
高一作文之暖冬
2019/11/09 职场文书
vue+springboot实现登录验证码
2021/05/27 Vue.js