深刻理解PHP面向对象的高级功能

个人博客网站文章地址:http://blog.mclink.xyz/index/article/index/id/24.html

对PHP oop编程的学习与认知。

1.使用Per-Class常量。

用途:可以在不需要初始化该类的情况下使用:

例子:

<?php
 class Man //定义Man类
 {
 	const birthday = 19960101; //定义常量变量
 }
  //使用const修饰的变量,我们可以通过::操作符对其进行访问。例如:
  
   echo Man::birthday;
  //使用const修饰的变量是无法进行修改的,例如:
  
  // Man::birthday=19990101;
  
  //上面那句是会报语法错误的。

 ?>
 
 

执行结果:打印出变量值 也就是19960101

2.对静态方法的实现

用途:PHP可以在方法前面使用static关键字,该方法就可以在未初始化类的情况下通过类名::来进行调用,类似于上面。例如:

<?php
  class Man //创建一个Man类
  {
	static function boy() //创建静态方法
	{
	   return 'boy';	//函数返回字符串boy
	}
  }
  echo Man::boy(); //打印函数的返回值,也就是boy
  
  //但是在静态方法中,是不能使用this关键字的。因为可能会没有可以引用的对象实例
  //通俗点说,就是一般我们调用函数是使用obj->method(),而$this就是当前的对象,但是因为
  //我们没有对类进行进行实例化,也就没有所谓的对象,故不能使用。
  
 ?>
 

3.延迟静态绑定

从PHP5.3版本引入了延迟静态绑定(last static binding)的概念。

用途:允许在一个静态继承的上下文中对一个被调用类的引用。父类可以使用子类重载的静态方法。例如:

<?php
 class father //father类
 { 
 	public static function who()
 	{
 		echo __CLASS__;//__CLASS__作用是当前的类名,此处打印出father
 	}
 	public static function test()
 	{
 		static ::who();//进行静态绑定
 	}
 	
 }
 class son extends father//son类继承father类
 {
 	public static function who()
 	{
 		echo __CLASS__; //打印 出son
 	}
 }
  son::test(); //结果是打印出son.
  //在这行代码中,test()是父类的一个方法,但是因为静态绑定,使得子类可以使用test()
  //并且使用子类中重载的who方法,打印出son。
 ?>
 

4.使用instanceof关键字对类的类型和类型提示进行检查

用途:可以检查对象是否是特定类的实例,是否从某个类继承过来或者是否实现了某个接口。是一个高效率的条件操作符,

例如:

<?php
 interface  a //声明接口a
 {
 	
 }
 class AAA //声明类AAA
 {
			
 }
 class BBB extends AAA implements a //声明类BBB继承类AAA并且实现接口a
 {
 	
 }

 $a=new AAA();
 $b=new BBB();
 echo $b instanceof BBB.'<br/>'; //打印结果为 1(true)
 echo $b instanceof  AAA.'<br/>';//打印结果为 1(true)
 echo $b instanceof  a;          //打印结果为 1(true)
?>
 

此外,PHP还提供了类的类型提示的思想,通常我们向一个函数传递一个参数时,不能传递该参数的类型。使用类类型提示,可以指定必须传入的参数为类类型。如果传入的不符合。将产生一个错误。类型检查等价于instanceof的作用。

例如:

function check(B $someclass)

//...

}

这样上例函数要求$someclass必须是类B的实例。如果这样调用,将会产生致命的错误:

check($a); //$a是类A的实例


5.使用clone关键字对对象进行克隆

用途:允许复制一个已有的对象。例如:

$c = clone $b;

$c将有与对象$b相同类的副本,而且具有相同的属性值。

但是,有时候我们并不想把默认行为也同时克隆出来,此时我们应该在基类中创建一个__clone()方法。这个方法的创建类似于构造函数或者析构函数,使用这个方法的好处是在使用默认行为创建一个副本后能够被调用,我们可以只改变希望改变的内容。当我们使用clone关键字时,__clone()函数会被自动调用。


6.PHP对抽象类的使用

抽象类是不能被实例化的,同样类方法也没有实现,只是提供类方法的声明,没有具体的实现。

PHP使用关键字abstract来修饰一个抽象类/抽象方法。

注意:包含抽象方法的任何类自身必须也是抽象的。(跟C++差不多)

用途:抽象类主要是作为基类来使用的,抽象方法和抽象类主要用于复杂的类层次结构,该层次关系需要确保每一个子类都包含并且重载了某些特定的方法。


7.使用__call()重载方法

 这个方法的实现类似与__get(),__set(),__construct(),__desconstruct().

用途:实现方法的重载

例如:

<?php
 class overload
 {
 	public function __call($method,$p) //第一个参数是包含了被调用的方法名称,第二个参数是包含了传递给该方法的参数数组
 	{
 		if($method == 'display')
 		{
 			if(is_object($p[0]))
 			{
 				$this->displayObject($p[0]);
 			}
 			else if(is_array($p[0]))
 			{
 				$this->displayArray($p[0]);
 			}
 			else
 			{
 				$this->displayScalar($p[0]);
 			}
 		}
 		
 	}
 	function displayObject()
 	{
 		echo 'Object';
 	}
 	function displayArray()
 	{
 		echo 'Array';
 	}
 	function displayScalar()
 	{
 		echo 'Scalar';
 	}
 	
 }
 $ov=new overload();
 $ov->display($ov);         //结果打印出Object
 $ov->display(array(1,2,3)); //结果打印出Array
 $ov->display('cat');        //结果打印出Scalar
 
 //注意,我们不用实现任何display方法。
?>
 

8.对__autoload()方法的使用。

该方法并不是一个类方法,而是一个单独的函数,也就是说,我们可以在任何类声明之外声明这个函数,如果实现了这个函数,它将在实例化一个还没有被声明的类自动调用。

用途:尝试包含或请求任何用来初始化所需类的文件。

例如:

function __autoload($name)
 {
	include_once $name.'.php';
 }

上面的代码,当我们实例化一个还没有声明的类时,便会自动包括具有与该类相同名称的文件。


9.实现迭代

PHP提供了一个十分有用的特性,就是可以使用foreach()方法通过循环的方式取出一个对象的所有属性,就像数组那样。

例如:

<?php
 class test
 {
 	public $a=1;
 	public $b=2;
 	public $c=3;
 }
 $y=new test();
 foreach ($y as $value)
 {
 	echo $value.'<br/>';
 }
?>
 
 

打印结果是:

1

2

3

10.实现对类的打印

如果我们想把一个类打印出来,PHP提供了一个__toString()函数。

具体实现:

<?php
 class test
 {
 	public $a=1;
 	public $b=2;
 	public  function __toString()
 	{
		return(var_export($this,TRUE)); //var_export()函数打印出类中的所有属性		
 	}
 }
 $y=new test();
 echo $y; //打印结果:test::__set_state(array( 'a' => 1, 'b' => 2, ))
?>

11.使用反射(Reflection)API

反射是通过访问已有类和对象来找到类和对象的结构和内容的能力。

用途:当使用未知或文档不详的类时,就可以使用。

例如:

<?php
 require_once('one.php');
 
 $class= new ReflectionClass('one');
 echo '<pre>'.$class.'</pre>';
?>
 

用来找到同目录的one.php,其内容如下:

<?php 
	class one
	{
		public $time=2;
		function test()
		{
			return 'ok';
		}
	}
	$a=new one();
	$a->test();
?>

程序的输出为:


可知,反射API的输出信息是非常的详细的。



本文是由作者纯手工编写,转载请联系作者,注明出处,谢谢。


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MClink

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值