面向对象编程(四)
命名空间
命名空间介绍
如果一个项目很大,项目中由很多文件组成,如何有序的组织这些文件就是一个大问题,PHP提供了命名空间来解决。
多学一招:
C#语言中也是通过“命名空间”来解决的
Java语言通过“包”来解决的。
命名空间的声明与使用
通过namespace来声明命名空间
多级命名空间
<?php
namespace China\ShangHai\PuDong; //多级命名空间
function getInfo() {
echo ‘我是中国人<br>’;
}
namespace USA\Washington;
function getInfo() {
echo ‘I am a America<br>’;
}
//调用
header(‘Content-Type:text/html;charset=utf-8’);
getInfo(); //I am a America
\China\ShangHai\PuDong\getInfo(); //我是中国人
访问空间元素的三种方法
- 非限定名称访问(类似于相对路径)
- 完全限定名称访问(绝对路径)
- 【部分】限定名称访问(相对路径)
引入命名空间(use)
分析:PuDong\getInfo()如何调用的?
第一步:通过命名空间拼接,拼接成\ USA\Washington\ PuDong\getInfo(),但是在这个地址下找不到此函数,所以继续执行第二步
第二步:由于引入了China\ShangHai\PuDong命名空间,又可以拼接成China\ShangHai\PuDong\ getInfo(),这个地址是可以找到函数的,所以调用此函数。
引入类(use)
通过use关键字引入类
给类取别名(as)
如果引入的类和已经存在的类同名,就会报错,我们可以引入类的同时给类取别名
<?php
namespace China\ShangHai\PuDong;
class Person {
public $name=’中国人’;
}
namespace USA\Washington;
class Person{
public $name=’美国人’;
}
header(‘Content-Type:text/html;charset=utf-8’);
use China\ShangHai\PuDong\Person as P; //引入类,并给类取别名
$person=new P();
echo $person->name; //中国人
公共命名空间
如果PHP文件中没有namespace关键字声明,该文件的元素都在“公共命名空间”下,访问公共命名空间用“\”。
命名空间的注意事项
- 命名空间中可以放函数,类,const常量
- 在第一个namespace之前不能有任何的代码,header()也不行。
- 包含文件不能改变当前的命名空间
用文件的地址做命名空间,通过命名空间就可以实现自动加载类
- 在Framework/Core文件夹下创建Student.class.php
<?php
namespace Framework\Core;
class Student {
public function show() {
echo ‘Core\Student\show()<br>’;
}
}
- 在Framework/Lib文件夹下创建Student.class.php
<?php
namespace Framework\Lib;
class Student {
public function show() {
echo ‘Lib\Student\show()<br>’;
}
}
- 在php中通过命名空间实现自动加载类
异常处理(Exception)
使用的关键字
try:检测代码中的异常
catch:捕获抛出的异常
throw:抛出异常
Exception:PHP内置的异常类
Exception异常类中的方法
Exception是基础异常类,该类提供了一些方法
方法 |
描述 |
getMessage() |
获取异常中的错误信息 |
getCode() |
获取异常的编码 |
getFile() |
产生异常的文件路径 |
getLine() |
产生异常的行号 |
异常的例题
自定义异常,捕获多个异常
PHP只提供了异常类,没有提供具体的某种异常,比如年龄异常,邮件异常等。
自定义异常必须继承Exception类,Exception类是所有异常类的父类。
<?php
//空异常
class NullException extends Exception {
}
//年龄异常
class AgeException extends Exception {
}
if(isset($_POST[‘button’])) {
$name=$_POST[‘name’];
$age=$_POST[‘age’];
try
{
if($name==”)
throw new NullException(‘姓名不能为空’); //抛出空异常
if($age==”)
throw new NullException(‘年龄不能为空’); //抛出空异常
if(!($age>=10 && $age<=20))
throw new AgeException(‘年龄必须在10-20之间’); //抛出年龄异常
}
catch(NullException $e)
{
echo $e->getMessage();
}
catch(AgeException $e)
{
echo $e->getMessage();
}
catch(Exception $e){ //必须放在所有的catch的最后
echo $e->getMessage();
}
}
?>
<form method=”post” action=””>
姓名: <input type=”text” name=”name”> <br />
年龄: <input type=”text” name=”age”> <br />
<input type=”submit” name=”button” value=”提交”>
</form>
介绍netbeans
安装netbeans
在安装netbeans之前必须先安装jdk(java开发包)
安装JDK后,再下一步,下一步安装netbeans.。
使用netbeans
双击netbeans图标
继续如下操作
创建完毕后,在虚拟目录的文件夹中多了一个“nbproject”文件夹,此文件夹用来让netbeans软件管理虚拟目录的,不是项目文件夹。在最后项目上传到服务器的时候要将此文件夹删除。
反射(Reflection)
反射的概念
程序可以访问、检测和修改它本身状态或行为的一种能力
反射的作用
获取对象对应的类中的属性,方法,参数,注释等封闭的信息,主要用来了解类、方法等内部结构。
反射的分类
了解如下几个反射类即可。
使用反射类(了解内容)
通过反射了解类的内部结构
语法:
ReflectionClass::export(类名);
例题
通过上面的例题可以得出结论,PHP最顶层的父类是一个空类,代码
class stdClass{
}
通过反射获取类中的属性、方法、常量
<?php
class Student{
const PI=3.14;
public $name=’tom’;
private $sex=’f’;
public function show(){
}
}
//通过反射获取类中的成员
$info= new ReflectionClass(‘Student’); //实例化反射类对象,此对象中包含了Student类中的信息
//获取常量信息
$const=$info->getConstants(); //获取所有常量,返回常量数组
$const=$info->getConstant(‘PI’); //获取PI常量
//获取方法信息
$method=$info->getMethods(); //获取所有方法,返回方法信息数组
$method=$info->getMethod(‘show’); //获取show()方法信息
//获取属性信息
$propty=$info->getProperties(); //获取所有属性信息
$propty=$info->getProperty(‘sex’); //获取sex属性
var_dump($propty);
通过反射实例化对象
newInstance()就是用来实例化对象,构造函数需要几个参数,就通过newInstance()传递几个参数。
通过反向代理调用类方法
正向代理:局域网中所有电脑通过服务器访问外网,局域网中电脑感受到服务器的存在,这种代理是正向代理
反向代理
将上面的理论平移到反射中来
A调用A的方法:正向代理
通过反射,A调用B的方法:反向代理