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模拟HTTP认证
Oct 09 PHP
BBS(php &amp; mysql)完整版(二)
Oct 09 PHP
php+mysql开源XNA 聚合程序发布 下载
Jul 13 PHP
PHP Header用于页面跳转要注意的几个问题总结
Oct 03 PHP
PHP获取163、gmail、126等邮箱联系人地址【已测试2009.10.10】
Oct 11 PHP
php &amp;&amp; 逻辑与运算符使用说明
Mar 04 PHP
基于PHP选项与信息函数的使用详解
May 10 PHP
PHP使用自定义方法实现数组合并示例
Jul 07 PHP
PHP多进程编程实例详解
Jul 19 PHP
Django 中 cookie的使用
Aug 17 PHP
laravel利用中间件防止未登录用户直接访问后台的方法
Sep 30 PHP
基于thinkphp5框架实现微信小程序支付 退款 订单查询 退款查询操作
Aug 17 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获取本地图片文件并生成xml文件输出具体思路
2013/04/27 PHP
ThinkPHP实现递归无级分类――代码少
2015/07/29 PHP
PHP后期静态绑定之self::限制实例分析
2018/12/21 PHP
PHP使用mongoclient简单操作mongodb数据库示例
2019/02/08 PHP
PHP 代码简洁之道(小结)
2019/10/16 PHP
javascript 写类方式之五
2009/07/05 Javascript
关于锚点跳转及jQuery下相关操作与插件
2012/10/01 Javascript
JavaScript获取/更改文本框的值的实例代码
2013/08/02 Javascript
图片上传判断及预览脚本的效果实例
2013/08/07 Javascript
jQuery ajax调用WCF服务实例
2014/07/16 Javascript
js操作table元素实现表格行列新增、删除技巧总结
2015/11/18 Javascript
js实现索引图片切换效果
2015/11/21 Javascript
javascript Slip.js实现整屏滑动的手机网页
2015/11/25 Javascript
解决bootstrap导航栏navbar在IE8上存在缺陷的方法
2016/07/01 Javascript
JS针对Array的各种操作汇总
2016/11/29 Javascript
BootStrap实现响应式布局导航栏折叠隐藏效果(在小屏幕、手机屏幕浏览时自动折叠隐藏)
2016/11/30 Javascript
AngulerJS学习之按需动态加载文件
2017/02/13 Javascript
jQuery实现切换隐藏与显示同时切换图标功能
2017/10/29 jQuery
vue组件中使用iframe元素的示例代码
2017/12/13 Javascript
如何利用@angular/cli V6.0直接开发PWA应用详解
2018/05/06 Javascript
小程序tab页无法传递参数的方法
2018/08/03 Javascript
JQuery特殊效果和链式调用操作示例
2019/05/13 jQuery
浅谈javascript错误处理
2019/08/11 Javascript
JS遍历树层级关系实现原理解析
2020/08/31 Javascript
12步教你理解Python装饰器
2016/02/25 Python
Python Json序列化与反序列化的示例
2018/01/31 Python
python如何拆分含有多种分隔符的字符串
2018/03/20 Python
Python3中_(下划线)和__(双下划线)的用途和区别
2019/04/26 Python
Django REST framework内置路由用法
2019/07/26 Python
python与pycharm有何区别
2020/07/01 Python
MAC平台基于Python Appium环境搭建过程图解
2020/08/13 Python
Pytorch生成随机数Tensor的方法汇总
2020/09/09 Python
HTML5的语法变化介绍
2013/08/13 HTML / CSS
HTML5新特性之type=file文件上传功能
2018/02/02 HTML / CSS
党员批评与自我批评总结
2014/10/15 职场文书
AudioContext 实现音频可视化(web技术分享)
2022/02/24 Javascript