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 31 PHP
php数组转换js数组操作及json_encode的用法详解
Oct 26 PHP
php中in_array函数用法探究
Nov 25 PHP
PHP中使用break跳出多重循环代码实例
Jan 21 PHP
10款PHP开源商城系统汇总介绍
Jul 23 PHP
CI框架数据库查询缓存优化的方法
Nov 21 PHP
深入讲解PHP的对象注入(Object Injection)
Mar 01 PHP
PHP高效获取远程图片尺寸和大小的实现方法
Oct 20 PHP
PHP实现函数内修改外部变量值的方法示例
Dec 28 PHP
PHP实现支持CURL字符串证书传输的方法
Mar 23 PHP
浅谈laravel中的关联查询with的问题
Oct 10 PHP
Laravel服务容器绑定的几种方法总结
Jun 14 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中使用sockets:从新闻组中获取文章
2006/10/09 PHP
一个简单的域名注册情况查询程序
2006/10/09 PHP
PHP 学习路线与时间表
2010/02/21 PHP
用php的ob_start来生成静态页面的方法分析
2011/03/09 PHP
YII2.0之Activeform表单组件用法实例
2016/01/09 PHP
Yii2中cookie用法示例分析
2016/07/18 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
2017/08/28 PHP
看了就知道什么是JSON
2007/12/09 Javascript
jquery autocomplete自动完成插件的的使用方法
2010/08/07 Javascript
javascript复制粘贴与clipboardData的使用
2014/10/16 Javascript
Angularjs 基础入门
2014/12/26 Javascript
Vuejs第七篇之Vuejs过渡动画案例全面解析
2016/09/05 Javascript
js 作用域和变量详解
2017/02/16 Javascript
js实现移动端微信页面禁止字体放大
2017/02/16 Javascript
vue实现消息的无缝滚动效果的示例代码
2017/12/05 Javascript
详解使用webpack构建多页面应用
2017/12/21 Javascript
解决vue build打包之后首页白屏的问题
2018/03/06 Javascript
vue移动UI框架滑动加载数据的方法
2018/03/12 Javascript
vue 国际化 vue-i18n 双语言 语言包
2018/06/07 Javascript
elementUI 设置input的只读或禁用的方法
2018/10/30 Javascript
python对url格式解析的方法
2015/05/13 Python
Python中read()、readline()和readlines()三者间的区别和用法
2017/07/30 Python
pyenv虚拟环境管理python多版本和软件库的方法
2019/12/26 Python
Python PIL库图片灰化处理
2020/04/07 Python
中国旅游网站:途牛旅游网
2019/09/29 全球购物
Java工程师面试集锦之Spring框架
2013/06/16 面试题
珍珠鸟教学反思
2014/02/01 职场文书
优秀学生获奖感言
2014/02/15 职场文书
李开复演讲稿
2014/05/24 职场文书
歌颂党的演讲稿
2014/09/10 职场文书
综合素质评价个性与发展自我评价
2015/03/06 职场文书
民事二审代理词
2015/05/25 职场文书
《有余数的除法》教学反思
2016/02/22 职场文书
为什么node.js不适合大型项目
2021/04/28 Javascript
JavaScript的function函数详细介绍
2021/11/20 Javascript
Python使用pandas导入xlsx格式的excel文件内容操作代码
2022/12/24 Python