记录练习,供我以后参考。特别是在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 "成功完成抽象类继承以及多态的使用";
}