资讯专栏INFORMATION COLUMN

PHP OOP

imtianx / 2624人阅读

摘要:使用了一段时间从对的不了解再到使用觉得挺好特写下看面向对象我是看的这个鸡啄米的并不是为了面向对象而面向对象而是为了达到代码的重用性灵活性扩展性对象和类从先有对象才有人类这个来说有点不合理的合理类具有相同属性的一组对象的集合对象类实例化之后就

PHP 使用了一段时间, 从对OOP的不了解, 再到使用, 觉得挺好, 特写下

看面向对象, 我是看的这个鸡啄米的c++, http://www.jizhuomi.com/softw...

OOP并不是为了面向对象而面向对象, 而是为了达到代码的重用性灵活性扩展性

对象和类

从先有对象才有人类, 这个来说, 有点不合理的合理

类:具有相同属性的一组对象的集合
对象:类实例化之后就是对象
看下一般的类的定义

name = $name;
        $this->age  = $age;
        $this->sex  = $sex;
    }
    // 析构函数
    function __destruct(){
        echo "byebye
";
    }
    // 成员方法
    function eat(){
        echo "my name is ". $this->name;
    }
    function sleep(){
        echo "i am sleeping";
    }
}
// 类的实例化
$jaime = new Person("jaime", "man", 24);
$jaime->eat();

?>

保存为index.php, 在命令窗口输入

$ php index.php
my name is jaime
byebye

如果

$jaime = new Person("jaime", "man", 24);

改为

$jaime = new Person("jaime", "man");

则会触发异常, 会有以下的消息出来, 包括错误信息, 错误行数, 和堆栈信息

$ php index.php

Fatal error: Uncaught exception "Exception" with message "must set name , sex, age" in E:
etindex.php on line 15

Exception: must set name , sex, age in E:
etindex.php on line 15

Call Stack:
    0.0025     242440   1. {main}() E:
etindex.php:0
    0.0025     243016   2. Person->__construct() E:
etindex.php:30
对象和内存

说点理论上的东西吧,

内存的分类:

堆(heap): 不可直接存取, 存储占有空间很大的数据类型的数据

栈(stack): 可以直接存取, 存储占用相同空间长度并且占用空间小的数据, 如存放局部变量,函数参数,当前状态,函数调用信息等

$jaime = new Person("jaime", "man", 24);

$jaime是存放在栈内存里面的引用变量, 即存储在堆中对象的首地址, 一个指针

new Person 实例化出来的对象是存放在堆内存里面的, 是真正的对象实例

对象和成员

变量,方法(内部成员函数)的前缀:

private: 私有成员

public:  公有成员(外部接口),没有加修饰, 默认就是public

protected: 保护型成员, 继承的类可以调用

访问private修饰的变量

Fatal error: Cannot access private property Person::$name in E:
etindex.php on line 36

如果想访问private, protected修饰的成员:

把private改为public

使用__get(), ___set()魔术方法, 但是还是写出代码来看看根据实际情况使用

name = $name;
        $this->age  = $age;
        $this->sex  = $sex;
    }
    function __destruct(){
        echo "byebye
";
    }

    function eat(){
        echo "my name is ". $this->name."
";
    }
    function sleep(){
        echo "i am sleeping
";
    }

    function __get($property_name){
        $access_array = ["age","name"];// 只允许访问age,name两个私有成员
        if(in_array($property_name, $access_array)){
            return ($this->$property_name);
        }
        else{
            return NULL;
        }
    }
    function __set($property_name, $value){
        $access_array = ["age"];// 只允许访问age这个私有成员
        if(in_array($property_name, $access_array)){
            $this->$property_name = $value;
        }
    }

}

$jaime = new Person("jaime", "man", 24);
$jaime->eat();
echo ($jaime->age === NULL)? "NULL":$jaime->age;
echo "
";
echo ($jaime->sex === NULL)? "NULL":$jaime->sex;
$jaime->age = 80;
echo "
";
echo ($jaime->age === NULL)? "NULL":$jaime->age;
echo "
";
$jaime->name = "lll";
echo ($jaime->name === NULL)? "NULL":$jaime->name;
echo "
";
?>

执行结果如下

$ php index.php
my name is jaime
24
NULL
80
jaime
byebye
类的继承
name = $name;
        $this->age  = $age;
        $this->sex  = $sex;
    }
    function __destruct(){
        echo "byebye
";
    }

    function hello(){
        echo "my name is ". $this->name."
";
    }
    function sleep(){
        echo "i am sleeping
";
    }
}


class Student extends Person
{
    private $school;

    function __construct($name, $sex, $age, $school)
    {
        // 调用父类方法, 构造函数
        parent::__construct($name, $sex, $age);
        $this->school = $school;
    }
    // 重载了父类方法
    function sleep(){
        echo "afternoon sleep
";
        // 调用父类方法
        parent::sleep();
    }
}

$jaime = new Student("jaime", "man", 24,"zh");
$jaime->hello();
$jaime->sleep();
?>

执行后输出

$ php index.php
my name is jaime
afternoon sleep
i am sleeping

byebye

调用父类的方法需要用parent

静态成员和常量

no bb, show code

show();
?>

结果

$ php is.php
China
 en
I live in China
I live in American
xxxAmerican en

类的静态变量,类似于全局变量,能够被所有类的实例共享,类的静态方法也是一样的,类似于全局函数, 静态成员被这个类的每个实例对象所共享

访问静态方法访问静态成员不能用$this, 需要用self

$this表示了此方法的对象

"self"表示此静态方法所在的类, self::成员

抽象方法和抽象类

什么叫抽象?不具体的就叫抽象! so

抽象方法 : 类里面没有具体方法体的方法(其实就是不具体的方法)

抽象类: 含有抽象方法的类,

抽象类不能实例化会报错"Cannot instantiate abstract class ", 有点像C里面的函数声明, 仅仅只是一个声明

fun1();
(new demo0())->fun2();
(new demo0())->fun3();
?>
接口interface 什么是接口?

如果一个内里面所有的方法都是抽象方法, 我们可以把声明方式换为接口

接口是一种特殊的抽象类, 接口不能包含成员的任何代码,只定义成员身。接口成员的具体代码由实现接口的类提供

接口的继承
接口的实现
fun1();
(new demo())->fun2();
(new demo())->fun3();
(new demo())->fun4();
?>
一个类实现多个接口

一个人要遵守的法律不止一步吧, 所以see code

fun1();
(new demo())->fun2();
(new demo())->fun3();
(new demo())->fun4();
?>

你娶了你老婆你得对她的家人负责吧, 就像下面

// 使用extends继承一个类,使用implements实现多个接口
class demo extend AbstractClass implements One, Two{
    ......
    // 所有接口中的方法都要实现才可以实例化对象
}
反射Reflection

需求: 导出或提取出关于类、方法、属性、参数等的详细信息, 甚至是判断某个方法是否存在
这里我不做多说, 看我在实际的项目中的实际应用,
这是一个API的入口处理函数, 如果存在这个方法就执行并返回结果, 不存在就抛出异常,
因为接口函数是不断增加甚至是变化的, 使用反射作为api的入口可以让你的具体的api函数变化了入口也不用改

try {
    // 使用工厂方法实例化具体的接口
    $instance = new ApiLibraryApiFactory($module, $server, $this->params);
    // 反射方法
    $action   = new ReflectionMethod($instance->instance, $method);
    // 判断方法的类型
    if (!$action->isPublic() || $action->isStatic()) throw new ReflectionException();
    // 验证api参数
    $validator = new ApiLibraryApiValidator();
    $result    = $validator->check($this->params);
    if (false === $result)  {
        $this->result["code"] = $validator->code ? : $this->result["code"];
        $this->result["msg"]  = $validator->msg  ? : $this->result["msg"];
        throw new Exception();
    }
} catch(Exception $e){
    $this->_format();
}

参考:

《细说PHP 》 兄弟连

《PHP手册》

《php面向对象(OOP)编程完全教程》

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21681.html

相关文章

  • Learning PHP —— 设计模式 | Chap1:浅谈设计模式中的OOP

    摘要:而哈士奇区别于普通狗,又有新的特征逗比,爱捣乱为了保证类之间的松绑定,通常会继承抽象类,而且是浅继承只有一层子类。如果知道所有类都会共享一个公共的行为实现,就使用抽象类,并在其中实现该行为。 为什么使用OOP OOP是一个模块化的过程,目的是为了把复杂问题简单化,一个模块解决一个复杂问题的某一个方面,即一个类应当只有一个职责 OOP区别于顺序式编程与过程式编程,在于: 1.顺序编程...

    SunZhaopeng 评论0 收藏0
  • PHP面向对象(OOP)----分页类

    摘要:男获取端口号当前运行脚本所在的服务器的主机名。如果脚本运行于虚拟主机中,该名称是由那个虚拟主机所设置的值决定本文由甲爪广告联盟整理编辑 同验证码类,分页也是在个人博客,论坛等网站中不可缺少的方式,通过分页可以在一个界面展示固定条数的数据,而不至于将所有数据全部罗列到一起,实现分页的原理其实就是对数据库查询输出加了一个limit限制,接下来我们就开始准备今天分页类的逻辑 #### 逻辑准...

    qqlcbb 评论0 收藏0
  • 成为一个PHP专家:缺失的环节

    摘要:为了成为一个专家,他必须先成为中级者。它非常适合于急于求成或者没有太多技术的人,但掌握绝对无法使你成为一个专业的开发者它使用意大利面条式的编码,教你的是不合适的设计原则。 这一篇文章是Becoming a PHP Professional系列 4 篇博文中的第 1 篇。 当浏览各类与PHP相关的博客时,比如Quora上的问题,谷歌群组,简讯和杂志,我经常注意到技能的等级分化。问题都类...

    cooxer 评论0 收藏0
  • Cocoa改造前篇 - 说在前面的

    摘要:即使如此,仍有一部分人至今站在的对立面,从代码复杂度建模能力要求等方面提出异议,坚持写的时候不构造类,写纯过程的程序。但其实,这些自称为原党的朋友,并不能说自己没有使用,因为这些语言中变量,跟语言中的变量,有本质的不同。 更好的阅读体验请点击 原文 从面相对象说起 面向对象的程序设计(Object-Oriented Programming,简记为OOP)这个概念大家都有所耳闻,目前(2...

    Noodles 评论0 收藏0
  • 我的 PHP 学习路线

    摘要:我的学习路线入门入门没啥好说的,会基本编码,基本的开发结构通常指,呵呵哒,类与对象,就差不多了,可以说是入门了。在这些已有基础,我们需要学习并且还需要学会各种推陈出新,这样才可以让自己让他人走得更远。 我的 PHP 学习路线 1. PHP 入门 PHP 入门没啥好说的,会基本编码,基本的开发结构(通常指MVC,呵呵哒),类与对象,就差不多了,可以说是入门了。 1.1 OOP 写 PHP...

    zhunjiee 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<