php类的抽象运用练习,包括继承的方式多态和接口的方式多态

2 篇文章 0 订阅
1 篇文章 0 订阅

记录练习,供我以后参考。特别是在thinkphp3上的使用。

<?php
//面向对象抽象类多态实现
abstract class Employee{
	abstract function continueToWork();
}
class Sales extends Employee{
	private function makeSalePlan(){
		echo "make sale plan";
	}

	public function continueToWork(){
		$this->makeSalePlan();
	}
}

class Market extends Employee{
	private function makeProductPrice(){
		echo "make product price";
	}

	public function continueToWork(){
		$this->makeProductPrice();
	}
}

class Engineer extends Employee{
	private function makeNewProduct(){
		echo "make new product";
	}

	public function continueToWork(){
		$this->makeNewProduct();
	}
}

class Demo{
	public function Work(Employee $employeeObj){//添加父类类型限制传参类型,使其满足多态第三点要求,父类指向子类
		$employeeObj->continueToWork();
	}
}
//调用
$obj = new Demo();
$obj->Work(new Sales());
$obj->Work(new Market());
$obj->Work(new Engineer());

首先这是网上的例子的引用。

接下来把这示例放到tp3上使用。

接口示例:

按照tp3的命名规范就可以自动加载。文件夹对应命名空间,类一般都放在Org目录下。

1.在Org目录下新建Trains目录再在Trains目录下新建Interfaces目录。

在Interfaces目录下创建Foods.class.php文件如下:

<?php
//Foods.class.php  
namespace Org\Trains\Interfaces;
//面向对象抽象类多态实现
/**
 *
 */
interface Foods
{
	// public $name;//接口不能有自己的属性
	public function taste();
}

创建接口成功,接下来实现接口:

2.在Trains目录下新建Apple.class.php文件内容如下:

<?php
//Apple.class.php
//接口多态尝试
namespace Org\Trains;
/**
 *在thinkphp3.2中为了实现接口,需要按照tp3的规定使用命名空间
 *按照tp3的规定进行自动加载:
 *1.在类文件命名的时候需要命名成.class.php的方式
 *2.类库放在Org目录下,命名空间就是Org
 */
use Org\Trains\Interfaces\Foods;
class Apple implements Foods
{
    public $name = "苹果";//接口不能有属性
    private function clear(){
		echo "洗干净就可以吃不用削皮";
    }
    public function taste()
    {
        $this->clear();
    }

}

在Trains目录下新建Pear.class.php文件内容如下:

<?php
//Pear.class.php
//接口多态尝试
namespace Org\Trains;
/**
 *在thinkphp3.2中为了实现接口,需要按照tp3的规定使用命名空间
 *按照tp3的规定进行自动加载:
 *1.在类文件命名的时候需要命名成.class.php的方式
 *2.类库放在Org目录下,命名空间就是Org
 */
use Org\Trains\Interfaces\Foods;
class Pear implements Foods
{
    public $name="梨";
    private function xiaopi(){
		echo "给梨削皮后再吃";
	}
    public function taste()
    {
        $this->xiaopi();
    }

}

在Trains目录下新建Tomato.class.php文件内容如下:

<?php
//Tomato.class.php
//接口多态尝试
namespace Org\Trains;
/**
 *在thinkphp3.2中为了实现接口,需要按照tp3的规定使用命名空间
 *按照tp3的规定进行自动加载:
 *1.在类文件命名的时候需要命名成.class.php的方式
 *2.类库放在Org目录下,命名空间就是Org
 */
use Org\Trains\Interfaces\Foods;
class Tomato implements Foods
{
    public $name = "番茄";
    private function zhantang(){
		echo "给番茄蘸点白糖后再吃会更好吃";
	}
    public function taste()
    {
        $this->zhantang();
    }
}

3.创造一个Foods接口的运用类People

放在Trains目录下,内容如下:

<?php
//People.class.php
namespace Org\Trains;
//面向对象抽象类多态实现
/**
 * 
 */
use Org\Trains\Interfaces\Foods;
class People
{
	public function Eat(Foods $fz){
		echo '正在吃'. $fz->name.PHP_EOL;//这种用法好像不规范,该怎么办呢?
		$fz->taste();
		echo PHP_EOL;
	}
}

4.正式使用,可以在控制器的方法中实例化一个来用

use Org\Trains\People;
use Org\Trains\Apple;
use Org\Trains\Pear;
use Org\Trains\Tomato;
//use Org\Trains\Interfaces\Foods;
//记得在头部加上命名空间。

public function interfaceDemo()
    {
        $pepo = new People();
        $pepo->Eat(new Apple());
        $pepo->Eat(new Pear());
        $pepo->Eat(new Tomato());

    }
//控制器中调用。初步使用,考虑下面用工厂模式吗?

 

继承示例:

1.创建抽象类Employee,放在Trains目录下

<?php
//Employee.class.php
namespace Org\Trains;
//面向对象抽象类多态实现
abstract class Employee{
	abstract function continueToWork();
}

2.创建三个子类Engineer、Engineer、Sales

 

<?php
//Engineer.class.php
//接口多态尝试
namespace Org\Trains;
/**
 *在thinkphp3.2中为了实现接口,需要按照tp3的规定使用命名空间
 *按照tp3的规定进行自动加载:
 *1.在类文件命名的时候需要命名成.class.php的方式
 *2.类库放在Org目录下,命名空间就是Org
 */

class Engineer extends Employee
{
    private function makeNewProduct(){
		echo "make new product";
	}

    public function continueToWork()
    {
        $this->makeNewProduct();
    }
}
<?php
//Market.class.php
//接口多态尝试
namespace Org\Trains;
/**
 *在thinkphp3.2中为了实现接口,需要按照tp3的规定使用命名空间
 *按照tp3的规定进行自动加载:
 *1.在类文件命名的时候需要命名成.class.php的方式
 *2.类库放在Org目录下,命名空间就是Org
 */

class Market extends Employee
{
    private function makeProductPrice(){
		echo "make product price";
	}
    public function continueToWork()
    {
        $this->makeProductPrice();
    }
}
<?php
//Sales.class.php
//接口多态尝试
namespace Org\Trains;
/**
 *在thinkphp3.2中为了实现接口,需要按照tp3的规定使用命名空间
 *按照tp3的规定进行自动加载:
 *1.在类文件命名的时候需要命名成.class.php的方式
 *2.类库放在Org目录下,命名空间就是Org
 */

class Sales extends Employee
{
    private function makeSalePlan(){
		echo "make sale plan";
	}
    public function continueToWork()
    {
        $this->makeSalePlan();
    }
}

3.创建运用类Worker

<?php
//Worker.class.php
//接口多态尝试
namespace Org\Trains;
/**
 *在thinkphp3.2中为了实现接口,需要按照tp3的规定使用命名空间
 *按照tp3的规定进行自动加载:
 *1.在类文件命名的时候需要命名成.class.php的方式
 *2.类库放在Org目录下,命名空间就是Org
 */

class Worker
{
    public function Work(Employee $eobj)
    {
        $eobj->continueToWork();
    }
}

4.调用方式和接口好像是一样的。

use Org\Trains\Sales;
use Org\Trains\Engineer;
use Org\Trains\Market;
use Org\Trains\Worker;

//这里我没放到控制器里,但是记得,下面的方法是在控制器里面的。
public function extendsDemo()
    {
        $wk = new Worker();
        $wk->Work(new Sales());
        $wk->Work(new Engineer());
        $wk->Work(new Market());
        echo "成功完成抽象类继承以及多态的使用";
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值