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 相关文章推荐
通过html表格发电子邮件
Oct 09 PHP
PHP 存取 MySQL 数据库的一个例子
Oct 09 PHP
windows下PHP APACHE MYSQ完整配置
Jan 02 PHP
探讨各种PHP字符串函数的总结分析
Jun 05 PHP
解析mysql中UNIX_TIMESTAMP()函数与php中time()函数的区别
Jun 24 PHP
PHP error_log()将错误信息写入一个文件(定义和用法)
Oct 25 PHP
Yii使用CLinkPager分页实例详解
Jul 23 PHP
php获得网站访问统计信息类Compete API用法实例
Apr 02 PHP
php对文件夹进行相关操作(遍历、计算大小)
Nov 04 PHP
Symfony的安装和配置方法
Mar 17 PHP
非集成环境的php运行环境(Apache配置、Mysql)搭建安装图文教程
Apr 12 PHP
微信公众平台开发(五) 天气预报功能开发
Dec 03 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函数rtrim()使用中的怪异现象分析
2017/02/24 PHP
在laravel中使用Symfony的Crawler组件分析HTML
2017/06/19 PHP
Fixie.js 自动填充内容的插件
2012/06/28 Javascript
使用jQuery时Form表单元素ID和name命名大忌
2014/03/06 Javascript
归纳下js面向对象的几种常见写法总结
2016/08/24 Javascript
JS 根据子网掩码,网关计算出所有IP地址范围示例
2020/04/23 Javascript
jsp 自动编译机制详细介绍
2016/12/01 Javascript
动态创建Angular组件实现popup弹窗功能
2017/09/15 Javascript
利用vue组件自定义v-model实现一个Tab组件方法示例
2017/12/06 Javascript
nodejs实现爬取网站图片功能
2017/12/14 NodeJs
React native ListView 增加顶部下拉刷新和底下点击刷新示例
2018/04/27 Javascript
jQuery实现百度图片移入移出内容提示框上下左右移动的效果
2018/06/05 jQuery
详解nodejs 开发企业微信第三方应用入门教程
2019/03/12 NodeJs
JavaScript 变量,数据类型基础实例详解【变量、字符串、数组、对象等】
2020/01/04 Javascript
jQuery实现回到顶部效果
2020/10/19 jQuery
vue实现点击出现操作弹出框的示例
2020/11/05 Javascript
Vue Elenent实现表格相同数据列合并
2020/11/30 Vue.js
[01:16:28]DOTA2-DPC中国联赛 正赛 iG vs Magma BO3 第二场 2月23日
2021/03/11 DOTA
python实现socket客户端和服务端简单示例
2014/02/24 Python
利用Python查看目录中的文件示例详解
2017/08/28 Python
Python 实现文件打包、上传与校验的方法
2019/02/13 Python
Python+OpenCV+图片旋转并用原底色填充新四角的例子
2019/12/12 Python
django从后台返回html代码的实例
2020/03/11 Python
使用bandit对目标python代码进行安全函数扫描的案例分析
2021/01/27 Python
pycharm最新激活码有效期至2100年(亲测可用)
2021/02/05 Python
用CSS3实现瀑布流布局的示例代码
2017/11/10 HTML / CSS
html5中的一些标签学习(心得)
2016/10/18 HTML / CSS
阿迪达斯西班牙官方网站:adidas西班牙
2016/07/21 全球购物
世界闻名的衬衫制造商:Savile Row Company
2018/07/30 全球购物
Myprotein法国官网:欧洲第一运动营养品牌
2019/03/26 全球购物
财务部岗位职责
2013/11/19 职场文书
食品行业求职人的自我评价
2014/01/19 职场文书
学校纪律作风整改措施思想汇报
2014/10/11 职场文书
中秋节随笔
2015/08/15 职场文书
护士自荐信范文(2016推荐篇)
2016/01/28 职场文书
怎样评估创业计划书是否有可行性?
2019/08/07 职场文书