Php的面向对象

编程的艺术就是处理复杂性的艺术
----------------- Edsger Dijkstra

面向对象的核心内容就是一切事物皆为对象。
第一次接触面向对象的时候是java,面向对象主要的特点就是封装,继承和多态。对于面向对象的概念我也不必多说,这里我只记录一下php的面向对象的使用方法。

类的声明

和各种语言一样php也是通过class来声明类的
那么声明类需要几个注意

  • 权限修饰符是可选项(public protected private 或者省略)
  • class是创建类的关键字
  • 类名是所需要创建类的名称,在class之后,后面是{}
  • 类体必须放在{}里

下面是一个简单的类的声明,包括一个构造方法和一些getter和setter方法

<?php

/**
 * Created by PhpStorm.
 * User: surine
 * Date: 2017/8/10
 * Time: 21:15
 */
class student
{
  var $name;
  var $age;
  var $sex;

    /**
     * student constructor.
     * @param $name
     * @param $age
     * @param $sex
     */
    public function __construct($name, $age, $sex)
    {
        $this->name = $name;
        $this->age = $age;
        $this->sex = $sex;
    }

    /**
     * @return mixed
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * @param mixed $name
     */
    public function setName($name)
    {
        $this->name = $name;
    }

    /**
     * @return mixed
     */
    public function getAge()
    {
        return $this->age;
    }

    /**
     * @param mixed $age
     */
    public function setAge($age)
    {
        $this->age = $age;
    }

    /**
     * @return mixed
     */
    public function getSex()
    {
        return $this->sex;
    }

    /**
     * @param mixed $sex
     */
    public function setSex($sex)
    {
        $this->sex = $sex;
    }
    
}

下面是一个测试的文件

<?php
/**
 * Created by PhpStorm.
 * User: surine
 * Date: 2017/8/10
 * Time: 21:19
 */

//注意在这个地方,需要引用这个类文件(php的类要带个.class.php的后缀)
require_once 'Student.class.php';
echo "下面创建一个student对象";
//初始化
$stu = new Student("surine",12,"boy");
//使用
echo $stu->getName();
echo $stu->sex;

除了注意这个类需要手动引入之外其他的都很简单,和java的类似。

特殊访问方式

1.$this

this这个用法我们在java里也经常用,作用就是完成对象内部成员之间的访问。

2.::

相比this,::才是真正的强大,他可以在没有任何实例的情况下来访问类成员

那么他的格式如下

关键字::变量名/常量名/方法名

这里的关键字分为下面几种情况

1. parent : 调用父类的相关成员 (相当于java的super)
2. self:调用当前类的静态成员和常量
3. 类名:调用本类的变量常量和方法。

下面是一个演示

<?php
class animal{
    const NMAE = "动物";

    /**
     * animal constructor.
     */
    public function __construct()
    {
        //使用类名访问常量成员
        echo "动物类:".animal::NMAE;
    }
}

class Cat extends animal{
    const NMAE = "猫";

    /**
     * Cat constructor.
     */
    public function __construct()
    {
        echo "<br>";
        //使用parent访问父类构造
        echo parent::__construct();
        echo "<br>";
        //使用self访问自身常量成员
        echo self::NMAE;
        echo "<br>";
    }
}
   echo "类外调用:".Cat::NMAE;
   new Cat();

运行结果:

运行结果PNG

构造和析构

构造函数大家都知道,在面向对象语言中起着初始化的作用,php也不例外,java中构造函数必须和类同名,php也可以这样写,但是更常见的是下面这种写法

 public function __construct()
    {
        //注意construct前面是两个下划线
    }

我们知道java等语言构造方法是可以有多个的,我们称之为重载,但是php不允许这样,他通过默认参数来实现重载,我们可以给参数赋值,也可以不用这样达到了同样的一个效果。

那么我们同样知道析构函数是在对象销毁的时候执行的一个方法

 function __destruct()
    {
        // TODO: Implement __destruct() method.
    }

通常在析构方法里做一些释放资源的任务。

封装

这是面向对象的三大特点之一,封装的意思就是抽象一个类,包含一些属性,那么这些属性或者方法都有访问权限,比如说public,private,protected

继承

继承使得面向对象更加灵活,我们可以通过extends关键字来实现一个类的继承,在前面我也演示过,并且我们知道通过parent::来访问父类的方法

多态

多态顾名思义就是有多种状态,包括重载重写等
下面是一个通过接口(接口在下面讲到)实现的多态

<?php
/**
 * Created by PhpStorm.
 * User: surine
 * Date: 2017/8/11
 * Time: 14:26
 */
interface Type{
    public function go_Type();
}
class Type_car implements Type{

    public function go_Type()
    {
        echo "car";
        // TODO: Implement go_Type() method.
    }
}

class Type_bus implements Type{

    public function go_Type()
    {
        echo "bus";
        // TODO: Implement go_Type() method.
    }
}

function change($obj){
    if($obj instanceof Type){
        $obj->go_Type();
    }else{
        echo "obj不合法";
    }
}
change(new Type_car());

那么这个当然是输出car。

抽象

抽象类是不能被实例化的特殊类,他是配合多态使用的,只能作为其他类的父类,使用abstract来声明

那么抽象类和普通类相似,包括成员变量和成员方法,两者区别在于,抽象类至少要包含一个抽象方法,那这个方法是没有方法体,他的方法体是在子类中实现的。

例如:

<?php
/**
 * Created by PhpStorm.
 * User: surine
 * Date: 2017/8/11
 * Time: 14:11
 */
abstract class animal{
    abstract function run();
    abstract function eat();
}

class cat extends animal{

    //必须实现其方法
    function run()
    {
        // TODO: Implement run() method.
        echo "run()";
    }

    function eat()
    {
        // TODO: Implement eat() method.
       echo "eat()";
    }
}

$cat = new Cat();
//调用
$cat->eat();

我们抽象一个动物方法,然后用cat类继承自它,实现其中的相关方法,然后我们可以通过对象进行调用。

接口

继承增加了类的复用性,但php和java类似也只支持单继承,那么多继承当然是使用接口实现。

接口声明如下

<?php
/**
 * Created by PhpStorm.
 * User: surine
 * Date: 2017/8/11
 * Time: 14:17
 */
interface One{
    const CON = "value";
    function One();
}

interface Two extends One{
    function Two();
}

可以看到php的接口也是interface声明,而且也支持extends
那么接口怎么使用?

require_once "MyInter.php";
class TestInter implements One,Two{
    public function One(){
      echo "one";
    }
    public function Two(){
        echo "two";
    }
}
$test = new TestInter();
$test->Two();

输出结果就是two

其他关键字

1.final

final意思是最终的,最后的,也就是最终版本,不允许做其他修改,如果有个类用final修饰,那么他一定不会有子类,不会被继承

2.static

static就是静态的意思,在java中也是有的,他属于类本身,但是不属于类的任何实例,它相当于储存在类中的全局变量,那么同样我们可以使用::访问

魔术方法

php中有很多以__开头的方法,比如说构造,析构,这些方法被称为魔术方法,那么下面是几个魔术方法

1.__get() __set()

这是php的getter和setter,用于赋值获取值,为外部提供的访问接口

2.__isset() __unset()

这个函数类似于isset和unset函数,如果对象中存在__isset()方法,当在类的外部使用isset函数检测对象中的私有成员属性时,就会自动调用类中的__isset()方法完成对私有成员属性的检测操作
__unset()函数是删除指定的变量,参数为要删除的变量名称

3.__call()

这个函数的作用是:当对象企图使用一个不存在的方法时,系统就会调用call函数,并且把方法名和参数都记录下来。
下面是一个例子

<?php
/**
 * Created by PhpStorm.
 * User: surine
 * Date: 2017/8/11
 * Time: 14:43
 */
class Call{
    var $a;

    /**
     * Call constructor.
     * @param $a
     */
    public function __construct($a)
    {
        $this->a = $a;
    }

    /**
     * @return mixed
     */
    public function getA()
    {
        return $this->a;
    }

    /**
     * @param mixed $a
     */
    public function setA($a)
    {
        $this->a = $a;
    }

    function __call($name, $arguments)
    {
        echo $name;
        echo "<br>";
        print_r($arguments);
        // TODO: Implement __call() method.
    }
}

$a = new Call(10);
$a->A("???");

可以看到我们最后调用了A这个方法,这个方法其实是不存在的,系统识别到,并调用了__cal方法,输出结果就是call方法体里的内容

call.PNG
4.__toString()

这个方法在java中也见过,那么我们可以这样使用它

//在类里实现它
function __toString()
  {
      return "我是方法";
      // TODO: Implement __toString() method.
  }
//直接打印对象
echo $a; 

得到的结果就是执行了__toString输出的内容。
如果没有这个方法将会发生致命错误

5.__autoload()

可以看到我们在之前的类导入的时候都是手动require的,这样比较麻烦也比较乱。
那么系统为我们提供了自动导入的方法,下面一个小例子演示一下

<?php
/**
 * Created by PhpStorm.
 * User: surine
 * Date: 2017/8/11
 * Time: 14:55
 */
function __autoload($name){
    $file = realpath(__DIR__).'/'.$name.'.php';
    if(file_exists($file))
    {
        require_once($file);
       if(class_exists($name,false))
       {
           return true;
       }
        return false;
    }
    return false;
}
$test = new Call();
$test->getA();

在未实例化之前系统首先判断存不存在这个文件,然后确定导入之后才能实例化。

总结

当然面向对象不止这点东西,更多更有意思的东西在以后学习过程中研究。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,711评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,079评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,194评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,089评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,197评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,306评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,338评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,119评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,541评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,846评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,014评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,694评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,322评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,026评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,257评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,863评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,895评论 2 351

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,605评论 18 399
  • 原文链接:https://github.com/EasyKotlin 在前面的章节中,我们学习了Kotlin的语言...
    JackChen1024阅读 845评论 0 3
  • 思念钻出车窗 穿过高架,穿过山野,穿过隧道 轻轻落入房前,似檐上的呢喃 只一字想,便兴风作浪 无视地位、名誉、金钱...
    木头奶奶阅读 375评论 4 16
  • 要热爱祖国 要热爱人民 热爱劳动热爱科学要有公德心 学习要认真 不懂就要问 珍爱生命注意安全身体是根本 自尊自爱又...
    松平千枫斋阅读 258评论 0 1