PHP面向对象编程学习之二

接口

接口就是把不同类的共同行为经行了定义,然后在不同的类里面实现不同功能。当有很多人一起开发一个项目时,可能都会去调用别人写的一些类,那你就会问,我怎么知道他的某个功能的实现方法是怎么命名的呢,这个时候PHP接口类interface就起到作用了,当我们定义了一个接口类时,它里面的方式是下面的子类必须实现的,比如 :

<?php
interface Shop
{
	public function buy($gid);
	public function sell($gid);
	public function view($gid);
}  

class BaseShop implements Shop
{
	public function buy($gid)
	{
		echo('你购买了ID为 :'.$gid.'的商品');
	}
	public function sell($gid)
	{
		echo('你卖了ID为 :'.$gid.'的商品');
	}
	public function view($gid)
	{
		echo('你查看了ID为 :'.$gid.'的商品');
	}
}
?>

多态
因为接口的实现方法可以有很多,所以对于接口里面顶一顶方法的具体实现是多种多样,这种特性称为多态。多态是指在面向对象中能够根据使用类的上下文来重新定义或改变类的性质和行为。
PHP不支持重载实现多态,但是PHP可以变向的实现多态效果。
案例一:

<?
interface User{ // User接口
	public function  getName();
	public function setName($_name);
}

class NormalUser implements User { // 实现接口的类.
	private $name;
	public function getName(){
		return $this->name;
	}
	public function setName($_name){
		$this->name = $_name;
	}
}

class UserAdmin{ //操作.
	public static function  ChangeUserName(User $_user,$_userName){
		$_user->setName($_userName);
	}
}

$normalUser = new NormalUser();
UserAdmin::ChangeUserName($normalUser,"Tom");//这里传入的是 NormalUser的实例.
echo $normalUser->getName();
?>

案例二:

<?php
// 通过可变参数来达到改变参数数量重载的目的
// 不是必须传入的参数,必须在函数定义时赋初始值
function open_database($DB, $cache_size_or_values=null, $cache_size=null)
{
    switch (function_num_args())  // 通过function_num_args()函数计算传入参数的个数,根据个数来判断接下来的操作
    {
        case 1:
            $r = select_db($DB);
            break;
        case 2:
            $r = select_db($DB, $cache_size_or_values);
            break;
        case 3:
            $r = select_db($DB, $cache_size_or_values, $cache_size);
            break;
    }
    return is_resource($r);
}
?>

抽象类
抽象类是介于接口与类的定义之间
PHP5支持抽象类和抽象方法。抽象类不能直接被实例化,你必须先继承该抽象类,然后再实例化子类。抽象类中 至少要包含一个抽象方法。如果类方法被声明为抽象的,那么其中就不能包括具体的功能实现。
继承一个抽象类的时候,子类必须实现抽象类中的所有抽象方法;另外,这些方法的可见性 必须和抽象类中一样(或者更为宽松)。如果抽象类中某个抽象方法被声明为protected,那么子类中实现的方法就应该声明为protected或者public,而不 能定义为private。

<?php
abstract class AbstractClass
{
 // 强制要求子类定义这些方法
    abstract protected function getValue();
    abstract protected function prefixValue($prefix);

    // 普通方法(非抽象方法)
    public function printOut() {
        print $this->getValue() . " ";
    }
}

class ConcreteClass1 extends AbstractClass
{
    protected function getValue() {
        return "ConcreteClass1";
    }

    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass1";
    }
}

class ConcreteClass2 extends AbstractClass
{
    public function getValue() {
        return "ConcreteClass2";
    }

    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass2";
    }
}

$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') ." ";

$class2 = new ConcreteClass2;
$class2->printOut();
echo $class2->prefixValue('FOO_') ." ";
?>

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索接口
, 多态
, 方法
, 抽象
, 子类
, php预定义接口
, 必须
PHP抽象类
,以便于您获取更多的相关知识。

时间: 2024-08-31 17:26:00

PHP面向对象编程学习之二的相关文章

php面向对象编程学习笔记

(OOP)来开发.面向对象开发相对于面向过程有很多优点: 维护简单   模块化是面向对象编程中的一个特征.实体被表示为类和同一名字空间中具有相同功能的类,我们可以在名字空间中添加一个类而不会影响该名字空间的其他成员. 可扩充性   面向对象编程从本质上支持扩充性.如果有一个具有某种功能的类,就可以很快地扩充这个类,创建一个具有扩充的功能的类. 代码重用   由于功能是被封装在类中的,并且类是作为一个独立实体而存在的,提供一个类库就非常简单了. 它比较适合多人合作来开发项目,所以现在很多大中型网站

python网络编程学习笔记(二):socket建立网络客户端_python

1.建立socket 建立socket对象需要搞清通信类型和协议家族.通信类型指明了用什么协议来传输数据.协议的例子包括IPv4.IPv6.IPX\SPX.AFP.对于internet通信,通信类型基本上都是AF_INET(和IPv4对应).协议家族一般表示TCP通信的SOCK_STREAM或者表示UDP通信的SOCK_DGRAM.因此对于TCP通信,建立一个socket连接的语句为:s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)对于UDP通

PHP面向对象编程学习之一

继承 1.父类里面定义的类成员可以不用在子类中重复定义,节约了编程时间和代价 2.同一个父类的子类拥有相同的父类定义的类成员,因此外部代码调用他们的时候可以一视同仁. 3.子类可以修改和调整父类定义的类成员 <?php class Animal { private $weight; public function getWeight() { return $this->weight; } public function setWeight($w) { $this->weight = $w

Java面向对象编程学习总结

重要知识点总结如下: 1,抽象,封装,继承,多态是面向对象程序设计中得四个特点. 2,面向对象得软件开发大体分为:面向对象的分析,面向对象的设计,面向对象的实现. 可概括为如下过程:分析用户需求,从问题中抽取对象模型;细化模型,设计类,包括类的属性和类间的 相互关系,同时观察是否有可以直接引用的已有类或部件;选定一种面向对象的编程语言,具体编码实现 上一阶段类的设计,并在开发过程中引入测试,完善整个解决方案. 3,面向对象程序设计方法的优点是:可重用性,可扩展性,可管理性. 4,类的定义:cla

Oracle专家高级编程学习笔记( 二)

oracle|笔记|编程|高级 Oracle体系结构的3个主要组件:1.文件:组成数据库实例的5个文件(参数文件,控制文件,数据文件,临时数据文件,重做日志文件)2.系统全局区域SGA( System Global Area): Java池,共享池等3.物理进程与线程: 在数据库上运行3种不同类型的进程(服务器server进程,后台backgroud进程,从属slave进程) 术语解释:数据库: 物理操作系统文件的集合实例: 一组oracle进程和SGA二者关系:一个数据库可以被多个实例装载mo

我的opengl编程学习(二)(混合、深度测试、雾化、多边形平移、显示列表)

12 混合 混合的底层原理是:如果不开启混合,那么对于帧缓存中的同样一个片断,后来的颜色将会覆写原有的颜色,而开启混合,则会在后来的颜色到来时利用混合因子重新计算该颜色而不是简单的覆写.其中后来的颜色叫做源颜色,而缓存中原来存在的颜色叫做目的颜色. glEnable(GL_BLEND)打开混合开关,这样ALPHA值就可能会起作用了(如果你使用这个作为因子的话) 用 glBlendFunc()来产生源颜色和目的颜色的混合因子,有各种产生方法,最后总的混合颜色=源颜色×源颜色的混合因子+目的颜色×目

Lua面向对象编程学习笔记_Lua

其实 Lua 中的 table 是一种对象,因为它跟对象一样,有其自己的操作方法: 复制代码 代码如下: Role = { hp = 100 } function Role.addHp(hp)     Role.hp = Role.hp + hp end   Role.addHp(50) print(Role.hp) 上面代码创建了一个名为 Role 对象,并有一个 addHp 的方法,执行 "Role.addHp" 便可调用 addHp 方法. 不过上面对象 Role 是以全局变量的

简明Python教程学习笔记_6_面向对象编程

简介 类和对象是面向对象编程的两个主要方面.类创建一个新类型,而对象这个类的 实例 .这类似于你有一个int类型的变量,这存储整数的变量是int类的实例(对象). 类(Class)::用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 对象:          通过类定义的数据结构实例.对象包括两个数据成员(类变量和实例变量)和方法. 实例化:      创建一个类的实例,类的具体对象.方法:          类中定义的函数. (方法和函数在

PHP的面向对象编程:开发大型PHP项目的方法(二)(转载)

编程|对象|项目 PHP的面向对象编程:开发大型PHP项目的方法(二) 作者:Luis Argerich 译者:limodou "Another"类的对象现在拥有了父类(Something)的全部的数据成员及方法,而且还加上了自已的数据成 员和方法. 你可以使用 $obj2=new Something; $obj2->setX(6); $obj2->setY(7); PHP现在还不支持多重继承,所以你不能从两个或两个以上类派生出新的类来. 你可以在派生类中重定义一个方法,如