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 相关文章推荐
MySQL授权问题总结
May 06 PHP
php IP及IP段进行访问限制的代码
Dec 17 PHP
探讨捕获php错误信息方法的详解
Jun 09 PHP
PHP中执行cmd命令的方法
Oct 11 PHP
php求一个网段开始与结束IP地址的方法
Jul 09 PHP
php好代码风格的阶段性总结
Jun 25 PHP
PHP中ajax无刷新上传图片与图片下载功能
Feb 21 PHP
PHP获取当前日期及本周一是几月几号的方法
Mar 28 PHP
PHP中TP5 上传文件的实例详解
Jul 31 PHP
PHP简单验证码功能机制实例详解
Mar 27 PHP
Laravel多域名下字段验证的方法
Apr 04 PHP
解决Laravel 使用insert插入数据,字段created_at为0000的问题
Oct 11 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
日本十大惊悚动漫
2020/03/04 日漫
PHP MSSQL 存储过程的方法
2008/12/24 PHP
PHP开发中常用的字符串操作函数
2011/02/08 PHP
PHP模拟post提交数据方法汇总
2016/02/16 PHP
PHP实现基于面向对象的mysqli扩展库增删改查操作工具类
2017/07/18 PHP
php基于 swoole 实现的异步处理任务功能示例
2019/08/13 PHP
extJs 下拉框联动实现代码
2010/04/09 Javascript
理解Javascript_01_理解内存分配原理分析
2010/10/11 Javascript
关于JavaScript定义类和对象的几种方式
2010/11/09 Javascript
只需一行代码,轻松实现一个在线编辑器
2013/11/12 Javascript
jqplot通过ajax动态画折线图的方法及思路
2013/12/08 Javascript
iframe的onreadystatechange事件在firefox下的使用
2014/04/16 Javascript
使用JavaScript链式编程实现模拟Jquery函数
2014/12/21 Javascript
在Javascript中处理数组之toSource()方法的使用
2015/06/09 Javascript
Angularjs 实现分页功能及示例代码
2016/09/14 Javascript
纯JavaScript 实现flappy bird小游戏实例代码
2016/09/27 Javascript
BootStrap给table表格的每一行添加一个按钮事件
2017/09/07 Javascript
vue-cli 使用vue-bus来全局控制的实例讲解
2018/09/15 Javascript
详解Vue依赖收集引发的问题
2019/04/22 Javascript
JS浏览器BOM常见操作实例详解
2020/04/27 Javascript
Jquery $.map使用方法实例详解
2020/09/01 jQuery
jquery实现图片放大镜效果
2020/12/23 jQuery
使用rpclib进行Python网络编程时的注释问题
2015/05/06 Python
python生成IP段的方法
2015/07/07 Python
win系统下为Python3.5安装flask-mongoengine 库
2016/12/20 Python
基于MTCNN/TensorFlow实现人脸检测
2018/05/24 Python
浅析Python+OpenCV使用摄像头追踪人脸面部血液变化实现脉搏评估
2019/10/17 Python
澳大利亚香水在线:Price Rite Mart
2017/12/28 全球购物
威盛公司软件C++工程师笔试题面试题
2012/07/16 面试题
优秀社区干部事迹材料
2014/02/03 职场文书
黄金搭档广告词
2014/03/21 职场文书
学校工作推荐信范文
2014/07/11 职场文书
班主任经验交流材料
2014/12/16 职场文书
《从现在开始》教学反思
2016/02/16 职场文书
Mysql 性能监控及调优
2021/04/06 MySQL
Python使用sql语句对mysql数据库多条件模糊查询的思路详解
2021/04/12 Python