PHP面向对象编程--抽象类和方法

PHP除了简单的为了实现特定功能外,也可以实现面向对象的编程方式,而且也可以很优雅!
下面利用具体的代码实例,讲述面向对象中的抽象类和方法相关概念。


<?php
/**
 * Author: helen
 * CreateTime: 2016/4/10 11:18
 * description: 面向对象--抽象类和方法
 */
namespace Home\Controller\Program;
use Home\Controller\CommonController;
class AbstractController extends CommonController{
    //面向对象编程测试方法
    public function main(){
        $side1 = 5;
        $side2 = 10;
        $side3 = 13;
        $triangle = new Triangle($side1,$side2,$side3);
        echo $triangle->getArea();
        echo $triangle->getPerimeter();
        unset($triangle);
        echo '<br>';

        $user_data = array('username'=>'helen');
        $user = new User($user_data);
        $info = $user->read();
        var_dump($info);
        $user->update(array('username'=>'huihui'));
        $info = $user->read();
        var_dump($info);

    }
}
/*
 * 抽象类
 * 1、抽象类是父类的模板。通过定义一个抽象类,可以指明类的一般行为。
 * 2、换句话说,一个抽象类定义了接口:这个基类的继承类如何被使用。然后子类会负责定义这些接口的真正的实现。
 * 3、抽象类和普通类的最大区别在于,如果试图从抽象类创建一个对象将会出现一个致命错误。相反,抽象类就是用来扩展的,然后我们就可以创建这些派生类的实例。
 * 4、抽象类的定义方式以关键字abstract开始。
 * 5、抽象类也会有抽象方法。在此不需要定义方法的功能,其具体功能将由抽象类的子类来决定。
 * 6、抽象方法定义可见性,只需在abstract关键字之后添加相应的关键字。
 * 7、在扩展的类里实现抽象方法的时候,其可见性必须高于或等于抽象方法定义的可见性。
 * 8、不能将抽象方法定义为私有的(private),因为一个私有的方法不能被继承。
 * 9、在所有情况下,方法的实现版本也必须要和抽象方法的定义具有一样数目的参数。
 * 10、如果一个类中有抽象方法,那么这个类本身也应该是抽象类。但是,一个抽象类可以没有抽象方法.
 * 11、抽象方法需要被派生类继承。
 * */
/*
 * 接口
 * 1、定义为必须被特定类定义的功能接口。
 * 2、要创建接口,需要使用interface关键字。定义方法签名,而不是方法的真正实现。(作为惯例,接口名字经常以一个小写的i开始)
 * 3、接口中所有的方法都必须是公开的(public)。
 * 4、接口只定义了方法,但是没有包括属性。
 * 5、要将一个类和一个接口关联,需要在类的定义中使用implements操作符。然后这个类必须定义接口中列出的所有方法!
 *
 * */
/*
 * traits
 * 1、traits允许我们在不使用继承的情况下为一个类增加功能。
 * 2、优先级:traits中方法和类中方法同名,假如为类中直接定义的方法,则其优先级高;若为继承来的方法,则traits优先级高。
 * 3、在类中使用use traitsName即可直接使用。
 * */
/*
 * 类型提示
 * 1、需要在参数变量名前加上期望的类的类型。
 * */
/*
 * 命名空间
 * 1、使用namespace关键字
 * 2、子命名空间,使用一个反斜杠(\)表示。
 * 3、引用命名空间中的类,使用反斜杠来引用它。
 * 4、namespace关键字可以放在 declare()语句 之后。
 * 5、__NAMESPACE__常量代表当前的命名空间。
 * 6、PHP允许我们使用use关键字将命名空间带入当前的作用域,以便更快的引用一个命名空间。
 *
 * */
/*
 * __toString()方法
 * 当这个类的对象用做string(字符串)类型的时候就会自动调用这个方法。
 * */

abstract class Shape{
    abstract protected function getArea();
    abstract protected function getPerimeter();
}
class Triangle extends Shape{
    private $_sides = array();
    private $_perimeter = NULL;
    function __construct($s0=0,$s1=0,$s2=0){
        $this->_sides[] = $s0;
        $this->_sides[] = $s1;
        $this->_sides[] = $s2;
        $this->_perimeter = array_sum($this->_sides);
    }
    public function getArea(){
        return (sqrt(($this->_perimeter/2)*(($this->_perimeter/2)-$this->_sides[0])*(($this->_perimeter/2)-$this->_sides[1])*(($this->_perimeter/2)-$this->_sides[2])));
    }
    public function getPerimeter(){
        return $this->_perimeter;
    }
}
interface iCrud{
    public function create($data);
    public function read();
    public function update($data);
    public function delete();
}
class User implements iCrud{
    private $_userId = NULL;
    private $_username = NULL;
    function __construct($data){
        $this->_userId = uniqid();
        $this->_username = $data['username'];
    }
    function create($data){
        self::__construct($data);
    }
    function read(){
        return array(
            'userId'   => $this->_userId,
            'username' => $this->_username
        );
    }
    function update($data){
        $this->_username = $data['username'];
    }
    public function delete(){
        $this->_userId = NULL;
        $this->_username = NULL;
    }
}
trait tDebug{
    public function dumpObject(){
        $class = get_class($this);
        $attributes = get_object_vars($this);
        $methods = get_class_methods($this);
        echo "<h2>Information about the $class object</h2>";
        echo "<h3>Attributes</h3><ul>";
        foreach($attributes as $key=>$value){
            echo "<li>$key: $value</li>";
        }
        echo "</li></ul>";
        echo "<h3>Methods</h3><ul>";
        foreach($methods as $key=>$value){
            echo "<li>$key: $value</li>";
        }
        echo "</li></ul>";
    }
}

编程是一门技术,更是一门艺术!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值