PHP的面向对象的用法介绍

发布时间:2021-09-13 17:45:45 作者:chen
来源:亿速云 阅读:108

本篇内容主要讲解“PHP的面向对象的用法介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP的面向对象的用法介绍”吧!

面向对象

早期编程由于受电脑硬件限制,程序都是追求效率,而忽略可理解性,扩充性,随着硬件技术的发展,编程越来越重视多人开发,程序员越来越重视程序的可靠性,可扩展性,可维护性,所以刺激了程序语言的发展

面向过程

面向对象

面向对象和面向过程的核心区别是如何分配职责。

类和对象

面向对象是由一系统具有属性和方法的对象构成,对象之间相互交互 ,从而实现业务需求。

属性

方法

对象生命周期

类是一种抽象的概念,是具有相同语义定义对象的集合(具有相同属性和方法的集体),使用具体的类是不可行的,只能实例化。拿汽车举例,汽车的设计图纸就是类,汽车是对象。设计中重点是类的创建

类名书写规范

$this

对象中使用 $this 指针可以访问属性或方法。

class Code
{
    protected $len = 5;
    public function make()
    {
        return $this->len . $this->show();
    }
    public function show()
    {
        return ' : is show';
    }
}
echo (new Code)->make();

继承

通过使用 extends 可以继承父类的属性与方法,在PHP中继承是单一的。

class Notify
{
    public function message()
    {
        return 'notify message';
    }
}
class User extends Notify
{ }
echo (new User)->message();

父类调用

子类可以使用 parent 关键字调用父类方法

...
public function message()
{
	return parent::message();
}
...

方法重写

子类可以重写父类的方法,除非父类的方法没有使用 final 修饰。

class Notify
{
    public function message()
    {
        return 'notify message';
    }
}
class User extends Notify
{
    public function message()
    {
        return 'user notify';
    }
}
echo (new User)->message();

禁止重写

使用final声明的方法,将禁止在子类中重写父类方法。

public final function message()
{
	return 'notify message';
}

封装

public 公有

private 私有

protected 受保护

模块设计

trait

使用trait 机制可以变相的使用多重继承。

class Alipay
{
    use Pay;
}
class WePay
{
    use Pay;
}

trait Pay
{
    public function sn()
    {
        return 'ABCDEF';
    }
}
echo (new WePay)->sn();

如果本类与 trait 中存在同名的属性和方法时,将使用本类中的属性与方法。

...
class WePay
{
    use Pay;
    public function sn()
    {
        return __METHOD__;
    }
}

trait Pay
{
    public function sn()
    {
        return 'ABCDEF';
    }
}
...

多个trait

可以使用多个 trait 用逗号连接

...
use Pay,Site;
...

解决冲突

class WePay
{
    use Pay, Email {
    Pay::notify insteadof Email;
    Email::notify as EmailNotify;
}
trait Pay
{
    public function notify()
    {
        return __METHOD__;
    }
}
trait Email
{
    public function notify()
    { 
    	return __METHOD__;
    }
}
echo (new WePay)->notify();

Pay::notify insteadof Email 表示使用 Pay::notify 方法替代 Email::notify 方法。

Email::notify as EmailNotify` 将`Email:notify` 别名为 `EmailNotify

访问控制

可以为继承的 trait 方法重新定义访问控制

class WePay
{
    use Pay, Email {
    Pay::notify insteadof Email;
    Email::notify as protected EmailNotify;
    ...
}

多重trait

可以通过多个trait 组合来使用。

trait Notify
{
    public function response()
    {
        return 'notify response';
    }
}
trait Pay
{
    use Notify;
}

class User
{
    use Pay;
}
echo (new User)->response();

抽象方法

trait Notify
{
    public function response()
    {
        return 'notify response' . $this->sn();
    }
    abstract protected function sn();
}
trait Pay
{
    use Notify;
}

class User
{
    use Pay;
    protected function sn()
    {
        return 'SN999';
    }
}
echo (new User)->response();

静态方法

trait 中可以使用静态方法、抽象方法、静态属性。

...
trait Pay
{
    public function sn()
    {
        return 'ABCDEF';
    }
    public static function notify()
    {
        return __METHOD__;
    }
}
class WePay
{
    use Pay;
    ...
}
echo WePay::notify();

static

static:

static变量:

static方法:

类常量

使用 const 来定义类常量,常量使用 self::来调用。

class Model implements ArrayAccess, Iterator
{
    use ArrayIterator, Relation, Validate, Auto, Filter;
    //----------自动验证----------
    //有字段时验证
    const EXIST_VALIDATE = 1;
    //值不为空时验证
    const NOT_EMPTY_VALIDATE = 2;
    ...
}

$this self:: parent::

$this

self::

parent::

魔术方法

构造方法&析构方法

构造方法__construct()

析构方法__destruct():

__get 与__set

读取不可访问或不存在的属性时,__get() 会被调用,同理获取不可访问或不存的的属性时会执行 __set() 方法。

<?php
abstract class Query
{
    abstract protected function record(array $data);
    public function select()
    {
        return $this->record(['name' => '后盾人', 'age' => 33]);
    }
}
class Model extends Query
{
    protected $field = [
        'name'
    ];
		public function all(){
			$this->select();
			return $this->field;
		}
    protected function record(array $data)
    {
        $this->field = $data;
    }
    public function __get($name)
    {
        return $this->field[$name] ?? null;
    }
    public function __set($name, $value)
    {
        $this->field[$name] = $value;
    }
}

$user = new Model;
$user->all();
echo $user->name;
$user->name = '向军大叔';
echo $user->name;ry

### __isset() 与 __unset()

当使用 isset()函数或者empty()函数 判断属性是否存在或者是否为空的时候会自动触发。

当使用 unset() 函数判断属性时,如果存在__unset() 方法将会执行。

...
public function __unset($name)
{
	if (!isset($this->field[$name]) || in_array($name, $this->deny)) {
		throw new Exception('禁止操作');
	}
}
public function __isset($name)
{
	return isset($this->field[$name]);
}
...

抽象类&抽象方法

具有抽象方法的类为抽象类,抽象方法即为没有内容的空方法,要求子类进行完善内容,抽象类不能实例化,只能继承,通过extends来实现,抽象类中也可以定义普通方法

父类方法执行方式不确定,但子类还都有这个方法

例2:定义动物类,每个动物都有叫声方法,但是表面不同,所以要定义为抽象类,让每种动物类去实现功能。

接口

接口是一组成员声明方法的集合,包含空的成员方法和常量,空的方法要求继承类去具体实现。成员方法为public,属性为常量。

继承是一级一级层次式,如果某一层出现问题,整个继承就会出现意外。而接口只影响实现接口的类,接口可以在破坏原来的继承基础上对类扩展。接口可以实现多继承。

抽象类及普通类都可以实现接口,通过关键字implements

接口与抽象类的区别:

interface DbInterface {
    public function connectDb(); //获得连接   参数为表名
    public function close(); //关闭数据库
    public function exe($sql); //发送没有返回值的sql
    public function query($sql); //有返回值的sql
}
class Db implements DbInterface
{
	public function exe($sql){
	}
	public function query($sql{
	}
}

到此,相信大家对“PHP的面向对象的用法介绍”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

推荐阅读:
  1. PHP引用符&的用法介绍
  2. PHP面向对象的多态用法

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

php

上一篇:css中怎么设置元素宽度

下一篇:如何使用php foreach修改值

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》