PHP面向对象之封装,继承与多态详解

 更新时间:2022年05月24日 15:01:31   作者:dawn  
面向对象的三大特点是封装、继承、多态。本文将通过示例详细讲讲这三者的使用,文中示例代码讲解详细,需要的可以参考一下

在普通的编程中,没有涉及架构或者良好的设计,绝大多数都是使用的面向过程的方式。

当编程逐步深入后,就需要合理使用面向对象的知识来设计程序,而不是简单地脑海里有了思路就去写代码来实现,这是比较低级的做法。

面向对象的三大特点:封装、继承、多态。

封装、继承比较好理解,通过一个例子就能看明白:

<?php
class VisualObj{   
	private $Viual=true;
	protected $width;
	protected $height;
	protected $name;
}
class ActiveX extends VisualObj{
	const NamePrefix="ActiveX";
	protected static $count=0;
	public function __construct(string $name,int $width=100,int $height=50){
		$this->width=$width;
		$this->height=$height;
		self::$count=self::$count+1;
		if($name==''||$name==null){
			$this->SetName();
		}else{
			$this->name=$name;
		}
	}
	public function GetName(){
		return $this->name;
	}
	public function SetName(){
		$this->name=self::NamePrefix.$this->GetCount();
	}
	public function GetCount(){
		return self::$count;
	}
	public function GetWidth(){
		return $this->width;
	}
	public function GetHeight(){
		return $this->height;
	}
	public function __destruct(){
		echo "__destruct".$this->GetCount();
	}
}
 
$obj1=new ActiveX('');
echo $obj1->GetName();
echo "<br>";
echo $obj1->GetWidth();
echo "<br>";
echo $obj1->GetHeight();
echo "<hr/>";
$obj2=new ActiveX("新的控件",120,60);
echo $obj2->GetName();
echo "<br>";
echo $obj2->GetWidth();
echo "<br>";
echo $obj2->GetHeight();
echo "<hr/>";
?>

静态变量的理解,以前我们做C/S开发的时候,拖放控件到设计界面的时候总是能看到控件名字后面的数字是自动累加的,这个就是静态变量在起作用。

通俗的理解多态就是同样的方法名和参数名实现不同的功能。

在PHP中通过一个例子就好理解了。

1、通过接口演示

<?php
interface EditObj{
	public function SaveAs();
}
 
class ExcelObj implements EditObj{
	public function SaveAs(){
		echo "编辑Excel的保存";
	}
}
 
class WordObj implements EditObj{
	public function SaveAs(){
		echo "编辑Word的保存";
	}
}
 
class PptObj implements EditObj{
	public function SaveAs(){
		echo "编辑Ppt的保存";
	}
}
 
class app{
	public static function EndEdit($obj){ 
		$obj->SaveAs();
	}
}
 
app::EndEdit(new ExcelObj());
echo "<hr/>";
app::EndEdit(new WordObj());
echo "<hr/>";
app::EndEdit(new PptObj());
echo "<hr/>";
 
class TxtObj{
	public function SaveAs(){
		echo "编辑Txt的保存";
	}	
}
app::EndEdit(new TxtObj());
 
?>

2、通过(抽象)类演示

<?php
abstract class EditObj{
	public abstract function SaveAs();
	public function OutInfo(){
		echo '输出信息';
	}
}
 
class ExcelObj extends EditObj{
	public function SaveAs(){
		echo "编辑Excel的保存";
	}
}
 
class WordObj extends EditObj{
	public function SaveAs(){
		echo "编辑Word的保存";
	}
}
 
class PptObj extends EditObj{
	public function SaveAs(){
		echo "编辑Ppt的保存";
	}
}
 
class app{
	public static function EndEdit($obj){
		$obj->SaveAs();
	}
}
 
app::EndEdit(new ExcelObj());
echo "<hr/>";
app::EndEdit(new WordObj());
echo "<hr/>";
app::EndEdit(new PptObj());
echo "<hr/>";
 
class TxtObj{
	public function SaveAs(){
		echo "编辑Txt的保存";
	}	
}
app::EndEdit(new TxtObj());
 
?>

可以看到,最后的TxtObj因为有SaveAs方法,也得到了正确的执行。

我们可以加类型限制:

class app{
    public static function EndEdit(EditObj $obj){
        $obj->SaveAs();
    }
}

这样的话,最后的app::EndEdit(new TxtObj());就会报错了。

还可以加类型判断:

class app{
    public static function EndEdit($obj){
        if($obj instanceof EditObj){
            $obj->SaveAs();
        }else{
            echo "输入的类型错误,不能执行!";
        }
        
    }
}

这样事先的错误截断对用户就会好一些。

对于上面的接口也一样可以这样来做,代码也一样。

到此这篇关于PHP面向对象之封装,继承与多态详解的文章就介绍到这了,更多相关PHP封装 继承 多态内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • php不使用copy()函数复制文件的方法

    php不使用copy()函数复制文件的方法

    这篇文章主要介绍了php不使用copy()函数复制文件的方法,涉及php读写文件的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • php微信支付接口开发程序

    php微信支付接口开发程序

    微信支付接口现在也慢慢的像支付宝一个可以利用api接口来实现第三方网站或应用进行支付了,下文整理了一个php微信支付接口开发程序并且己测试,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • PHP文件生成的图片无法使用CDN缓存的解决方法

    PHP文件生成的图片无法使用CDN缓存的解决方法

    这篇文章主要介绍了PHP文件生成的图片无法使用CDN缓存的解决方法,这里的PHP生成图片是指src地址是一个PHP文件的图片,如果不做CDN,服务器的压力会非常大,本文就讲解了如何加进CDN的方法,需要的朋友可以参考下
    2015-06-06
  • php实现博客,论坛图片防盗链的方法

    php实现博客,论坛图片防盗链的方法

    这篇文章主要介绍了php实现博客,论坛图片防盗链的方法,涉及php字符串结合session判定图片的相关操作技巧,需要的朋友可以参考下
    2016-10-10
  • PHP Beanstalkd消息队列的安装与使用方法实例详解

    PHP Beanstalkd消息队列的安装与使用方法实例详解

    这篇文章主要介绍了PHP Beanstalkd消息队列的安装与使用方法,结合实例形式详细分析了PHP Beanstalkd消息队列的基本功能、原理、安装、使用方法及相关操作注意事项,需要的朋友可以参考下
    2020-02-02
  • php缓存的类型总结及用法

    php缓存的类型总结及用法

    在本篇文章里小编给大家整理了一篇关于php缓存的类型总结及用法,对此有需要的朋友们可以跟着学习下。
    2021-12-12
  • php快速url重写更新版[需php 5.30以上]

    php快速url重写更新版[需php 5.30以上]

    本代码是在apache上的LoadModule rewrite_module modules/mod_rewrite.so运行成功后的操作,利用php代码对网站url重定向为更复杂的逻辑结构。
    2010-04-04
  • 使用PHP解决http请求超时的问题

    使用PHP解决http请求超时的问题

    当进行HTTP请求时,有时候可能会遇到请求超时的情况,为了解决这个问题,本文给大家介绍了如何使用PHP解决http请求超时的问题,文中通过代码示例给大家介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • PHP中通过ADO调用Access数据库的方法测试不通过

    PHP中通过ADO调用Access数据库的方法测试不通过

    PHP中通过ADO调用Access数据库的方法测试不通过...
    2006-12-12
  • 深入PHP变量存储的详解

    深入PHP变量存储的详解

    本篇文章是对PHP变量的存储进行了详细的分析介绍,需要的朋友参考下
    2013-06-06

最新评论