php面向对象,第二阶段

尚未废话 ,作者想从来抛出标题。

一面向对象:

面向对象是一种编制程序观念,对于小白来讲,须臾间左右,难度非常的大,必要咀嚼和进行,慢慢掌握,为了防止陷入沉思的无底洞,先不用管为何
这样写,早先时代我们必要先熟习语法和用法,随着代码量的扩充,了解自然会深化.早先时代必须要先产生以下几点:

类是把富有相似天性的靶子归咎到一个类中,类正是一组一样属性和行为的指标的集纳。类和指标的关联:类是一般对象的叙述,先有类,再有目的。类是对象的空洞,对象是类的实例。通过class关键字创制类,成员属性是在类中评释的变量,三个类能够满含多个成员属性,成员属性可以有暗中认可值,也得以未有暗中认可值,假使有暗许值的话,值无法是变量、表明式、函数和章程的调用,只好是一个值。在类中扬言的措施,便是成员方法,八个类能够分包三个分子方法。实例化对象:通过new关键字

一、php承接难题

(1)常用魔术点子:

  1. 类证明语法 试评释student类,有score属性和study方法
  2. 权限封装 知道public、 protected、 private各自的可知范围
  3. 接轨 写A类,再写B类承袭自A类,且要重写A类中的某些方法
  4. 静态属性与静态方法,知道static静态方法供给用类名::方法名()调用
  5. 魔术点子 精通常用魔术点子分别在如曾几何时间被调用
  6. 写贰个抽象类,并用2个子类分别承接达成 剖析那2个子类有啥样共同特点?
  7. 写多个接口,并用2个类分别承接达成 深入分析那2个类有哪些共同点
  • 类名 来实例化类,实例化类的结果发生对象。每一种对象都以单身的,不均等。在类外界,通过对象援用名->属性,访谈或设置成员属性,通过对象援引名->方法,调用成员方法。在类内部,通过$this->属性名,访谈成员属性,通过$this->方法,调用成员方法,$this代表当前的靶子。

上代码。

1.__construct()实例化对象是被电动调用 具备构造函数的类会在每趟创造新对象时先调用此方式,所以极度适合在接纳对象从前做一些开始化专门的学问。
2.__destruct()当删除二个对象或贰个指标操作结束是被调用。如 C 。析构函数会在到某些对象的装有援用都被删去大概当目的被显式销毁时实行。
3.__call()对象调用有些方法。若方法不设有,那调用__call 这一个法子
4.__get()读取一个指标属性,要是指标属性是私人商品房的会调用它 获取的意味,当对象去做客四个不设有只怕权力相当不够的属性的时候,会自动触发的章程

面向进度 :每一个小系统具备显著的开头和和截至 。早先和截至之间全数严俊的因果关系。

php内部存款和储蓄器分配:php内存分为这几局地:栈空间段:空间小,CPU访问速度快,适合寄存代码中一时创办的一对变量(不经常数据寄存,用于存款和储蓄占用空间不改变,並且相当小的数据类型的内部存款和储蓄器段:整形,浮点,布尔),栈是后进先出的结构。堆空间段:用于存款和储蓄进度运营中动态分配的二个内部存款和储蓄器段,堆空间的深浅是不定点的,堆内部存款和储蓄器的轻重能够拓宽动态的扩展或缩短。能够用堆来存放数据长度可变,占用内部存款和储蓄器非常的大的多寡:字符串,数组,对象,都以积存在堆内部存款和储蓄器段中。代码段:代码段用于寄放一些可推行文件的操作命令的,它是可施行程序在内部存款和储蓄器中的一段镜像,代码段需求防止在运作时被违规修改,所以只同意大家读取操作,不容许写入。函数就存款和储蓄在代码段中。开端化静态段:用来贮存在可实行文件中已开头化的全局变量,也正是积攒程序静态分配的变量。在函数中用static关键字证明的静态变量,保存在开首化静态段中,还恐怕有类的静态属性和静态方法也是保存在开头化静态段中。对象在内部存款和储蓄器中是何等来分配的:在用new关键字创造对象后,对象的援用保存在栈里,对象保存在堆里,对象的办法保存在代码段里。

class father{ public function __construct(){ echo "类father";}}class child extends father{ public function __construct(){ echo "类child";}}$p=new child();
function __get($param)
    {
        echo '你在访问'. $param .'属性值为:'. $this->$param .'<br>';
    }

比如 :上帝创立一位,如果有70亿人那就很麻烦

php的构造函数:__construct,通过构造函数来形成指标数据先河化的行事。在历次用new创设新指标的时候,首先会活动调用类的构造函数。能够在构造函数的参数中为类的分子属性赋默许值。

出口结果: 类child

5.__set()给一个对象属性赋值时假诺属性是个人的会调用它
6.__toString()打印五个指标的时候会被调用。
7.__clone()克隆对象时被调用,如:$a=new test(); $a1=clone $a;   语法:变量 = clone 对象变量:克隆对象的时候,被克隆出来的靶子会去调用的办法

轻松函数先获得随机的数字 作为数组的下标,然后再从数组中收获相应下标的数字。

php的析构函数:__destruct,析构函数,不能够带有参数,析构函数会在对象的全数引用被去除或显式的绝迹从前会被调用。通过析构函数释放财富,满含结果集,数据库连接等。给指标援用赋值为 null 能够显式调用析构函数。

只要大家接触过纯面向对象的言语 :c#/java;遵照他们的语法,以上例子将会输出 :类father类child

例如:

 

面向对象的封装性:封装正是把大家的积极分子属性和成员方法封装起来,封装的意在,不想让类的外场“看到”。使用访问修饰符能够兑现封装。封装的功利在于可以吗不想揭穿给类外面包车型客车习性和办法,全部都遮盖起来,把类内部的细节不想让别人看来,那是就足以对成员开展访问调节。php5中的二种访问调节修饰符:public,暗中认可值,在类的其花潮表面。protected:受保障的,在类的中间或子类中能够访谈,但在类的表面,通过对象不或然访谈。private:私有的,只可以在类的内部开展访谈。

当我们在new子类对象的时候,编写翻译器应该会实例化它的父类,以此来发生三个卫冕链条,我们看看表面上php仅仅实例化了二个子类对象,那并不正确,也是继续难题发出的一个根本原因:php到底存不设有承接链?

class Human
{
    public $name = '小明';
    protected $age = '18';
    private $money = 'xxx';
function  __clone(){
echo “正在执行克隆操作 因为调用了克隆方法”;
}
}
$p1 = new Human;
$p2 = clone $p1;

面向对象

引进例子 :阴帝 人身蛇尾 , 用风皇造人引出类和实例 : 帝女造人前先 思虑 人的形象 然后再造人

所以 :人的形象是空虚的,用的话明人的特色;而每一人都以有血有肉的,且符合人的形象

 

类 :全体目的共同点的一个虚无!(便是一个 创立表达书)

目的 :正是遵照表明创建出来的具体对象

类中有哪些? 属性(譬如人:身体高度,体重,姓名)

能干什么?作用(说活,吃饭)

用 变量 和 函数 分别模拟 属性 和 功效

面向对象中 ,方法就是函数 ; 属性正是变量 ,只是面相对象中貌似说方法和质量

 

new 类名();//直接发生二个对象并回到该对象

$a = new 类名(); //那么a对象就包括 类中宣称的具有属性(类似关联数组)

 图片 1 图片 2

要调用对应的属性值能够 $a -> name (name不用$);要调用对应的办法 $a -> say()

面向对象oo(object oriented)oop加编制程序

证明类的时候 :

内部存款和储蓄器分配给类叁个空中,,里面寄存着类定义的质量和函数

new对象的时候 :

1、 申请内部存款和储蓄器,生成对象(属性集结)

2、 如若有结构函奉行

3、 重回对象的地址

 图片 3

                       内存分配图

 

语法正是法则; 标准 正是 道德

(1)属性的开首化 无法是表达式 如 : $a = 1 3 ;  java中是同意的

(2)同三个域内(举例四个类中),函数不能够重复定义(就是名字不可能同一)

(3)在一个类里面,借使要调用系统同名的自定义函数,须求用$this,不然调用系统函数 ; 其它二个类里面 二个函数调用 不是他里面的变量只怕它调用其余函数也要加 $this

 

组织函数 : __construct() , 注意前方是多个下划线 ; 当new对象(爆发对象),调用 ; 构造函数不可能被重载正是不能够再有同名的

 

析构函数 :__destruct()在对象被销毁的时候调用的函数 。 

什么销毁对象 :

1、显式销毁,unset(),直接赋值为null可能其余值

2、实施完最终一行代码时自动销毁(要是以前已经灭绝,则不再销毁)

 图片 4

 

对变量指向销毁难题

$a = new People(); //创制二个目的(new People()),并把使用权给变量$a($a是三个变量名,指向这几个指标)

$a = $b = $c ;  //3个变量都指向内部存款和储蓄器中的同叁个对象

图片 5

unset($a);//unset,正是销毁对象(object),但有别的变量$b等依然指向对象,那么该目的将不能够被灭绝,然则$a为null不再指向那一个指标

 

this绑定

当三个对象调用三个它对应类的不二秘籍时,该办法实施从前先形成贰个绑定,正是用

$this绑定到调用此措施的目的(这样才干在章程内对这一个指标的习性进行支配),因为方法内如若想拜见调用者(正是对象)的属性必需用$this;不不过掌握为艺术内部的三个片段变量

 图片 6

Java中不平等,函数无需this也能访谈方法外的变量

 

封装

打包的概念 : 通过修饰符 改造属性恐怕函数的拜会权限 ,达到维护的功用。

只可是封装起来是没意义的,还要供外界交互才行;所以经过多少个盛放的接口(正是三个函数)供外部调整;内部的操作,无需外表知道,进而遮盖其间的局地细节 。

如: 波轮洗衣机,你只要点击运转程序的开关就能够洗衣裳,不要求驾驭波轮洗衣机里面怎么运作

权限修饰符 :private protected public

private修饰的特性只可以在其 类里面 技巧被访谈到。

protected 本类和子类能访谈

private访问权限的bug : 对象时期能够互相操作同三个类中的属性,导致三个目的能够修改另一个对象的性质。

 图片 7

fatal error(致命错误)

 

封装 操作数据库的 类

类似把某部意义的一段代码放在七个类中 ; 类里面的措施相互调用

用面向对象的思维 对数据库操作 (mysql封装类)

诸如把连接数据的操作封装到三个总是函数中

连年数据库

发送 查询

对此select语句 重回查询数据数据

关闭mysql连接

 

继承

子类承袭父类的习性和方法,再进一步拓宽自身的特性和办法;父类的属性 和办法一般是七个回顾(全部目的都有些),提升代码的重新性

 

具有难题 :子类承继父类,子类有父类全部的习性和措施,在子类里面能够操作父类中国和南美洲private修饰的特性大概措施,不过父类中对此private修饰的属性也许措施子类不能操作(类外的界定限制)

 图片 8 图片 9

 

调用与覆盖难题 : 子类里面调用对应的性质时,子类未有掩盖父类中的属性只怕措施,则调用父类中的属性或方法,不然只调用子类中的,无论传参数是不是对。private的调用除外

 

注意持续父类之后,子类再注明与父类同样的属性,权限符只好更进一竿宽松恐怕大同小异 。 假设父类的品质有static,子类也必得有技术声称

 

★类内一般宣称只属性和章程,实例化也许输出等语句要写在方式里依然类外,不然报错

万一子类有和父类同样的办法,能使用parent::方法名()钦定调用父类的

 图片 10

 

构造函数是能够被接续的;要是子类中绝非写构造函数,在实例化子类的时候就能调用父类的构造方法。如若子类重新写则覆盖且只调用子类的。

因而只要父类的构造函数是必供给调用,最棒使用parent::__construct()调用一下(java区别,它会先调用父构造再调用子构造;php调用子构造)

比方 :数据库类中 父类构造函数有延续数据库,倘诺子类写了别的的话构造函数,则连接失利 (Java分化,父亲和儿子都调用)

 

在类外对象名只好调用类中public修饰的属性,其余的属性能够经过措施来调用。一般不写则默感觉public

图片 11 图片 12

 

多态

只空泛注明父类,具体的干活由子类对象完毕

java出现多态是因为它是强类型语言(正是定义了花色不能够随意改动),注脚的档期的顺序 后 传送参数必得是此类型 。 注脚参数时,注解为父类型,传参时,能够传子类型。以完毕多态的法力。比方:

多颜色手电筒难点 :评释手电筒,并接受玻璃的参数。然后玻璃有多样颜色,以完结区别成效。则为多态

php是弱类型语言,自身未有对项目未有检查评定,由此大致变态,后来5.3之后,引入了对于指标类型的参数检测。限制了灵活性达到多态

 图片 13 图片 14

php魔术方法:__construct() __destruct __get() __isset() __unset() __set($propertyName,$propertyVal):在类的外表对私家的或受保险的要么未定义的成员属性进行赋值 的时候会自动调用。__get($propertyName):在类的外表对私家的或受保险的要么未定义的积极分子属性实行读取 的时候会自动调用。

二、static 、self、parent这么些主要字

8.__sleep()Serialize 从前被调用,若对象非常的大,想删减一点东西在连串化可以用它。
9.__wakeup()Unserialize时被调用,做些对象的起首化职业。
10.__isset()检验贰个指标的性质是或不是存在若是检验的习性是私有的时候会被调用。使用isset或然empty去看清一个权力远远不够也许海市蜃楼的靶子属性的时候,会自动调用

 

__isset() :当在类的外表对民用的,受保险的要么未定义的积极分子属性举办isset()大概empty()调用时,会自动调用__isset()魔术点子。

class father{public $a="father";public function __construct(){ echo "类father";}public function Say(){ echo __CLASS__."say";}}class child{ public function __construct(){ parent::construct(); self::Say();static::Say(); $this->a; echo "类 child";}}$childs=new child();
function __isset($param)
    {
        echo $param;
        return true;
    }

static 静态属性

一般当 有些属性可能措施 是持有指标固有的(便是不改造),则表明为静态属性,节省里部存款和储蓄器,随时类名调用;无论函数调用多少次,只初阶化第1回.,如 static $a = 1;

静态属性存在于类内部存款和储蓄器中,并不是目的的内部存款和储蓄器中。只要有类就会访谈到,由此多少个静态属性独有二个,改1全变;只可以 类名::属性名 采访

 图片 15

 

静态方法

平凡方法和静态方法都设有 类内部存款和储蓄器 中 且独有二个

只是静态方法用类名调用,不用this绑定;普通方法供给有对象手艺用this绑定调用

 

安装ecshop的时候出现strict standard错误提醒,原因是本子高,代码书写语法有误,静态方法调用非静态方法时出现难点。

 

非静态方法,是无法由类名静态调用的.可是 PHP中的面向对象检验的并不严峻,

只要该措施未有$this,就能转接静态方法来调用. 

但是,在PHP5.3的strict等级下,可能PHP5.4的暗许等第

都已经对类名::非静态方法做了提拔

则会提醒:Strict Standards: Non-static method Human::eat() should not be called statically 

不可能静态的去调用非静态方法 ; 有static修饰的变量和函数不能够冒出$this

 

isset($this) 那么些时等候法庭判果断有没对象开展绑定;

代码剖析

 图片 16 图片 17

 

this就是指向当前指标实例的指针,不指向任何其余对象或类

self, parent的用法  (::(域运算符号))

self:指向类自身,也便是self是不指向别的已经实例化的指标 ,self使用来指向类中的静态属性或许措施

self::$staticProperty

self::staticMothed;

 

parent: 指向父类的指针,一般我们选取parent来调用父类的构造函数。

 

在引进本身的静态属性/静态方法,以及父类的方法时,能够用到.

parent::$staticProperty

parent::Mothed;

 图片 18

 

 

★应该选用this依然parent

 图片 19 图片 20

小结运用 

1: 修饰类的性格与措施为静态属性,静态方法

2: static::method(), 延迟绑定

3: 在函数/方法中,注解静态变量用

 

 

__unset() :当在类的外表对个体的,受保证的要么未定义的成员属性举行unset()调用时,会活动调用__unset()魔术点子。

假如php不设有传承链,那么以上程序将报错。所以php是存在承袭链。

 

单例形式

 

制止多少人付出进度,实例化过多导致能源浪费, 限制只实例化三次的形式

 

构造方法不能够施行则实例化败北

 

思路 :

 

1、 敬服或个体构造函数,房子外界实例化

 

2、 内部支出多少个国有的静态方法,负担实例化

 

3、 类有二个静态属性寄放对象

 

图片 21

<?php
class Single {
    //设置私有,保存实例状态
    static protected $ins = NULL;
    //设置为私有,限制类外实例化,若没有子类可去掉final
    final protected function __construct() {
        echo '实例化成功!';
    }
    //设置为静态方法,类外能调用,实例化
    static public function getinstance() {
        //self代表当前类,判断是否实例化
        if (self::$ins instanceof self) {
            return self::$ins;
        }
        self::$ins = new self();
        return self::$ins;
    }
}

$s1 = Single::getinstance();
$s2 = Single::getinstance();

//子类继承父类若还要单例,要用final修饰父类构造方法,
//阻止子类重写构造方法自己去new的问题
class Single2 extends Single {
}

$s11 = Single2::getInstance();
$s12 = Single2::getInstance();

if ($s11 === $s12) {
    echo "相等";
}
?>

图片 22

 

 

 

final

 

final 不能够修饰属性

 

final 修饰方法,此格局能继续,无法被重写

 

final 修饰类,则此类 无法被接续

 

 

 

使用extends关键字贯彻持续,PHP是单承接的,承继可以实现代码的高可重用性,高可扩充性。父类--基类--超类。子类--派生类--增加类。

何况上述存在部分语法规则,子类能够通过self恐怕是static等重大字,去调用父类中可供调用的点子,和$this类似。

11.__callStatic(),用静态方式中调用一个不得访谈方法时调用。

魔术点子

 

是指有些意况下,会自动调用的办法,称为魔术点子 ; 感到相似都是这一个权限不一致意调用或然是不设有的习性 才会触发魔术点子

 

PHP面向对象中,提供了那多少个魔术点子,

 

她俩的特点 都以以双下划线__开头的

 

__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state() 和 __clone()

 

__clone()   :克隆方法,当对象被克隆时,将会自动调用

 

图片 23

 

 

 

 

 

__get() :当我们调用贰个权力上不允许调用的质量,和不设有的性质时,__get魔术方法会自动调用,並且自动传参,参数值是属性名。酱紫就会幸免系统会直接报错,乃至fatal error,通过__get()大家就会自定义客商访谈时的拍卖作为。注意假设是数组方式的话那么这里的$p也正是键值(就是下标)

 

图片 24

 

流程:

 

$lily->age--无权-->__get(age);

 

$lily->friend--未有此属性-->__get('friend');

 

 

 

__set() :当为无权操作的习性赋值时,或不设有的特性赋值时,__set()自动调用,且自动传2个参数 属性 属性值

 

 图片 25

 

 

 

__isset() :当用isset()决断指标不可知的属性时(protected/private/官样文章的属性)

 

会引发 __isset()来执行

 

图片 26 图片 27

 

isset($obj->xyz) 属性为真,能印证  类评释了叁个xyz属性吗?

 

答:不能,因为isset($hua->tail)----没有tail属性---->__isset('tail');-à 如果__isset返回1则不能

 

 

 

__unset() : 当 用unset 销毁对象的不可知属性时,会抓住 __unset();

 

 

 

__call($a,$b) : 调用不可知(不设有或无权力)的不二秘诀时,自动调用;前参数是方法名,后是传参

 

 

 

__callStatic($a,$b) : 是调用不可知的静态方法时,自动调用.

 

 图片 28

 

 

 

__call是调用不可知(不设有或无权力)的秘技时,自动调用

 

$lisi->say(1,2,3);-----没有say()方法----> __call('say',array(1,2,3))运行

 

 图片 29

 

 

 

__autoload() : 假如调用某些不设有的类,在报错此前,系统会调用__autoload($n)函数,并把"类名"自动传给__autoload函数大家自然可以在__autoload里 加载必要的类!

 

 图片 30

 

 

 

 

 

魔术点子的行使

 

TP中设置客商注册的做法: 把表单中收受到的音信,直接提交叁个对象的性质,然后

 

目标add()  用sql语句写到数据库中

 

 图片 31

 

 

 

切切实实的笔触

 

在贰个类中装置一个空数组,利用__set()把传进来的值放到数组中,然后使用 add方法 与数据库交互 ; 酱紫防止了与其它同名属性的抵触

 

都以选用法力方法来实行操作

 

$date = array() 设置四个空数组

 

implode() :将数组按值进行私分

 

array_keys(array,value)  :获得数组中键名并以数组的款式 ; 前边多少个数组名必选 , 前者数组值可选  ;  只选前边四个则赶回全数键名 ; 两个选重临对应值得键名

 

 

 

2015/7/23

 

通过parent::关键字在子类中调用父类中被重写的情势。要是子类的根本字和父类一样,相当于子类重写了父类的方法。

那正是说大家是或不是就足以明白成:self::只怕是static::语法,指向了二个father类的实力对象? 要不然成员方法怎么调用?

12.__unset(),清除类中个人变量时自动调用 当用unset销毁对象的不可知属性时,会掀起 __unset();

重载与重写

 

重写/覆盖  override:子类重写了父类的同名方法。只要子类有该格局只调用子类的无论是参数是还是不是一样

 

图片 32

<?php
//模仿重载的功能
class Circle {
    public function area() {
        $a = func_get_args();
        $num = count($a);
        if ($num == 0) {
            echo '传入参数' . "n";
        } else if ($num == 1) {
            echo 3.14 * $a[0] . "n"; //学会利用已有的条件进行分析

        } else if ($num == 2) {
            echo $a[0] * $a[1] . "n";
        }
    }
}

$c = new Circle();
$c->area();
$c->area(3);

class P {
    public function a() {
        echo "nihao";
    }
}

$b = new P();
$b->a(2123, 'sdf');
?>

图片 33

 

 

 

重载 overload: 指存在八个同名方法,但参数类型/个数不一样,传差别的参数,调用差异的法子。可是在PHP中,差别意存在四个同名方法.因而,不可见形成java,c 中的这种重载

 

可是,PHP的利落,能达到规定的标准近似的功力

 

图片 34

<?php 
    function __autoload($n){
        require('./' . $n . '.php');
        echo "加载成功!";
    } 

    $test = new autoload_class();
    $test->say();
 ?>

图片 35

 

父类中的 final 方法不能被子类重写。

不过奇怪的是:static::/self:: 不可能调用属性字段,parent::也是那般。

function __unset($param)
    {
        echo '你想销毁我的',$param;
    }
unset($p1->age);
unset($p1->money);

 

 

在函数中动用static关键字表明的变量时静态变量,第贰遍调用此函数时一定于早先化static变量,当函数施行完后,statice变量未有被保释,而是保持在了静态内部存款和储蓄器中,当我们再一次调用那些函数的时候,会再也读取静态内部存储器中的值,函数static变量的值在函数多次调用时,其值不会丢弃,函数内部的static变量仅在函数内部是可知的。同样在类中也得以行使static关键字,用static关键字来定义类的静态属性和静态方法,通过static关键字评释的static成员属性和分子方法是属于类的,在类的其花月表面static属性和static方法毫无实例化类的靶子就足以访谈,通过 类名::属性名 和 类名:: 方法名 来访问。另外,在类的内部可以因此self:: 关键字来访谈static属性和static方法(推荐用self关键字),self关键字表示定义当前格局的类,在类的实例中也得以用self关键字来访谈static属性,在类的内部不可能用$this来援用static属性和static方法。在static方法内部,不可能利用$this,在static方法中也毫无援用非static内容(即未有用static修饰的属性或艺术)。在类的表面,通过类的实例的引用也可以调用类的static方法。类的static属性,在类的四个实例间分享,在那之中一个实例修改了static属性值,在类的拥有实例中都将获得更新。

以此就难堪了,凭什么非静态的措施能调用,字段属性就非常?

13.__autoload()

常量 (常量名全大写,不带$)

 

一般说来常量 :define('常量名',常量值); 全局有效.无论是页面内,函数内,类内,都能够访谈 ;

 

类内常量 : 类常量 在类内用 const 申明就可以;前面不用加修饰符,;且权限是public的,即外表也足以访问

 

成效域在类内,类似于静态属性 ;又是常量,则不得改.

 

实际上正是"不可退换的静态属性",就是能够 类名::常量名 访谈

 

 图片 36

 

 

 

 

 

魔术常量

 

1:不能手动修改他的值,所以叫常量

 

2:可是值又是各处境改动的,所以叫魔术

 

 

 

__FILE__  重临当前文件的不二秘籍 文件名

 

在框架开荒还是是网址初步化脚本中,用来测算网址的根目录

 

 

 

__DIR__ 再次来到当前的文书路径

 

 

 

__LINE__  重临当前的行号

 

在框架中,能够用来在debug时,记录错误音讯

 

 

 

__CLASS__ 再次来到当前的类名

 

 

 

__METHOD__ 再次回到当前的不二等秘书技名

 

 图片 37

 

 

 

推迟绑定

 

留意 :static::方法名  表示调用 对象类中的方法 也许性质

 

瞩目 一般书写的时候public等权限修饰符在static前,扩充专门的学问可读性

 

图片 38

 

 

 

图片 39

那正是说相应推翻self::/static::是目的的引用,他们应该是类层面上的引用。

自动加载类的方法 ,放在类的外表,当必要利用有些文件下下的全数类时,只须要安装    一个机关加载类的措施,就足以平昔通超过实际例化类名的艺术赢得类的目的

抽象

 

空泛类 :类前加 abstract 是抽象类,是抽象方法抽象类不能够 new 来实例化,有抽象方法,则此类必是抽象类;抽象类,内未必有抽象方法

 

架空方法 :方法前加 abstract,抽象方法 无法有方法体,所以并未有{} ; 而是直接();

 

子类 继承 抽象的父类 必得 重写父类的悬空方法!何况参数个数要一致

 

//利用面向对象观念贯彻差异语言首页接待!

 

//抽象类就是个模板,你们子类承袭笔者的类和议程自身搞自个儿想要弄的东西

 

//比如作者想要开辟越南语语言,只要扩大二个子类,不用修改父类的东西

 

//所以面向对象是可插拔的

 

 

 

图片 40

<?php
//利用面向对象思想实现不同语言首页欢迎!
//抽象类就是个模板,你们子类继承我的类和方法自己搞自己想要弄的东西
//比如我想要开发英语语言,只要增加一个子类,不用修改父类的东西
//所以面向对象是可插拔的
abstract class Language { //抽象方法
    public abstract function wel();
}
class China extends Language {
    public function wel() {
        echo "欢迎!";
    }
}
class English extends Language {
    public function wel($a) {
        echo "Welcome!";
    }
}
$language = 'China';
$w = new $language(); //666
$w->wel();
?> 

图片 41

 

证实 : 抽象类正是一个模板,作者不要忧郁同类的类不会做,反正你假使依照本身的沙盘做就不会错。进而到达极度各类分化的场地 和 幸免代码大量的修改 和 代码的正式(方法相同)

 

比如 :

 

公司网址要上线了,要选拔如何数据库? 先弄个mysql开拓着,到时候有标题再换也行。那么换数据库,会不会此前的代码又得重写? 其实不用忧虑,用抽象类!开采者,开垦时,就以db抽象类来开采。不管上线时,真正用怎么样数据库,笔者只要求再写一份如下类(右图)就能够。所以工作逻辑层不用改,因为都实现的db抽象类。

 

发出了争辨。

14.__invoke() mixed __invoke ([ $... ] ) 当尝试以调用函数的方法调用多少个指标时,__invoke() 方法会被活动调用。

 

 

在php脚本文件之中通过define只怕const来定义常量。在类内部通过const关键字定义常量属性。常量属性的名目一般用小写。常量的值只可以是值,无法是表明式或变量。在类内部通过类名或self访问常量属性,在类外界,通过类名来访谈,无法透过类的实例的援引来访谈。在类的内部也足以由此static关键字访谈const常量。

凭什么能调用成员的艺术,却力所不及调用成员属性?

15.__callStatic() 用静态格局中调用一个不足访问方法时, 会被调用

接口 

 

(未有括号) interface 接口名 {  }

 

类倘若是一种东西/动物的抽象,那么 接口则是东西/动物的效果与利益的用空想来欺骗别人,即再把它们的效果与利益各拆成小块自由组合成新的物种。

 

以人类为例, class Human 是人的草图而接口 是零件可以用三种组件构成出一种新特种来.

 

1、接口自个儿正是抽象的,内部宣称的不二等秘书技 暗中同意也是充饥画饼的.不用加 abstract

 

2、二个类能够叁回性完成五个接口.语法用 implements 完毕 (把小编那多少个成效达成了)

 

3、接口可承接另一个接口, 用extends ;注意实现时须把后续的接口的方

 

4、接口是一群抽象方法的印证,无法加属性

 

5、接口便是供组装成类用的,密闭起来没风趣,因而方法只可以是public

 

图片 42

<?php
/*
接口 就更加抽象了,比如一个社交网站,关于用户的处理是核心应用。
登陆 退出 写信 看信 招呼 更换心情
吃饭 骂人 捣乱 示爱 撩骚

这么多的方法,都是用户的方法,可写一个user类,全包装起来
但是,分析用户一次性使不了这么方法。于是分开多个类

用户信息类:{登陆,写信,看信,招呼,更换心情,退出}
用户娱乐类:{登陆,骂人,捣乱,示爱,撩骚,退出}
*/
interface UserBase { //注意没括号
    public function login($u, $p);
    public function logout(); //注意是抽象方法

}
interface UserMsg {
    public function wirteMsg($to, $title, $content);
    public function readMsg($from, $title);
}
interface UserFun {
    public function spit($to);
    public function showLove($to);
}
/*
作为调用者, 我不需要了解你的用户信息类,用户娱乐类,
我就可以知道如何调用这两个类

因为: 这两个类 都要实现 上述接口.
通过这个接口,就可以规范开发.

*/
class User implements UserBase {
    public function login($u, $p) {
        echo "用户登录";
    }
    public function logout() {
        echo "用户注销";
    }
}
?> 

图片 43

 

 

 

通过 is_a() ,instanceof 来检验二个对象援引是或不是是二个类,父类或接口的实例。get_class()重回当前调用对象引用的类名。get_parent_class()重回类或然指标的父类名。is_subclass_of()检验一个指标是或不是是另外三个类的子类。

答案存在于内部存款和储蓄器遍布方面:大家领悟内部存款和储蓄器分为4部分:

final用来使类不被持续,方法不被掩盖!
parent,能够调用父类成员中的成员变量,成员方法和常量;
self,能够调用当前类中的静态成员和常量;
const 是二个概念常量的显要字
类名,能够调用类中的常量,变量和艺术; 
static通过static 关键字修饰的分子属性和分子方法称为静态属性和静态方法.静态成员属性和章程没有必要被实例化就会一贯使用.
clone.对象的仿制能够经过机要字来完毕.使用clone对象与原对象未有其它关系,即克隆对象会重复申请一份储存空间来贮存原对象内容

包蕴类进来

 

include/require能够包涵有些php文件,然则不通晓是或不是调用过;革新使用魔术点子__aotoload($)

 

__autoload() : 假设调用某些不设有的类,在报错以前,系统会调用__autoload($n)函数,并把"类名"自动传给__autoload函数大家当然能够在__autoload里 加载必要的类!

 

 

 

★自定义 自动加载方法

 

通报系统,让系统掌握--笔者要好写了二个活动加载方法,用那些spl_auto_register($n)

 

 图片 44

 

 

 

★方法中能定义一个类,可是想要实施类里面包车型地铁东西,必需先动态调用方法(直接格局名),有return也不关事

 

 图片 45

 

 

 

 

 

===================================

  1. 静态数据区
  2. 代码区实例化对象的时候,将质量都存放到了堆里面。方法存在于代码区,调用的时候,依照类指针来搜寻贮存地方,实行调用。

 

异常

 

座谈:怎么着判断mysql类连接是或不是中标? 利用 在措施里面return?

 

实例化后重临二个目的,不能够分明是或不是连接成功 。 return无法干扰,仍旧是回去对象

 

化解这种难题,用十分类 Exception

 

 

 

 

 

注意 @mysql_connect();  //@表示忽略此处输出的谬误

 

关闭全体的一无可取报告 : Error_reporting(0);

 

 

 

图片 46

     {
         protected $conn = NULL;

         public function __construct()
         {
             $this->conn = mysql_connect('localhost','root','111');

             if (!$this->conn) //如果连接失败了,抛出错误
             {
             $e = new Exception('失败了!',9); // 
             throw $e;  //抛出异常
             }
         }
     }
    //若抛出异常,没有接受处理则会报错
     try  // 可能出现错误的代码并尝试捕捉错误信息
     {
         $my = new mysql();
     }catch(Exception $e) // 注意括号,处理错误
     {
             echo $e->getMessage();
            echo '错误代码',$e->getCode();
            echo '错误文件',$e->getFile();
            echo '错误行',$e->getLine();//抛出错误的行
     }
 ?>

图片 47

 

 

抽象类不可能平昔被实例化,只好通过子类来持续它,而且通过在子类中落成抽象类中的抽象方法使抽象类具体化,在抽象类中只要求定义子类需求的秘技,也足以在抽象类中一些落成部分故事情节,把公共的部分先完毕以下。在抽象类中务要求有抽象方法,抽象方法就四个虚无的思考,抽象方法未有具体的落实,通过 abstract 关键字来定义二个浮泛方法,抽象方法未有方法体,只是申明了三个调用形式,无法定义具体的意义完毕,子类在持续的时候必得达成全体的用空想来欺骗别人方法,子类在促成父类抽象方法的时候,可知性能够和父类一样也许从宽,子类中也能够定义自身的诀窍。在三个类中,只要有三个类是架空方法了,那么那一个类就亟须注明为abstract 抽象类。abstract抽象类不能够被实例化。

咱俩能够大要了然到,属性能够在代码运营时动态改换值。方法,一旦我们定义好以往,代码编写翻译完毕方法体就很难更换,所以在内部存款和储蓄器中如此贮存,越发节约空间。

(2)

接口正是一套标准或合同,是类和类之间的一种合同,接口也是对外提供劳动的一种出口。在接口定义中必得是彻彻底底的沙盘,接口定义中不得不定义功能,无法包罗具体的贯彻内容。通过interface 关键字来定义接口,在接口定义中得以分包方法,也得以分包属性,接口中的方法必得定义成 public 的,不能定义方法体。通过implements关键字来达成接口,完毕接口的时候必须兑现接口中持有的章程。三个类能够达成七个接口,多少个接口之间采取逗号分隔,两个接口中的方法是无法有重名的。一个类能够先接二连三别的二个类,在促成五个接口。接口也支撑承继,并且一个接口能够一而再多少个接口,接口间的承接格局和类的持续同样,在接口中还可定义常量,接口常量不能够被子类或许子接口所覆盖。

所以,不管是static 依然self、parent都以指向类指针,能够调用静态变量,以及艺术列表。$this真正指向本对象。

单例情势:保险二个类中,有且唯有四个实例存在并提供叁个访问点供全局采访,该实例能够被抱有的程序来寻访。
  一般有在,在这种景观下用:
  1、当要用贰个类时,又要用该类中的四个实例;
  2、new 来创造实例时会给程序形成财富的荒凉,而且实例越来越多也不好控制。
  3、分歧的线程调用时,恐怕会唤起不一样台的气象。
原型情势:用原型实例钦点创立对象的品种,并且经过拷贝那个原型来创立新的指标。
类的财富充足多、品质和平安要求,一般和工厂方法结合使用。
命令格局:将多个供给封装为二个目的,从而使您可以用不相同的乞请对顾客拓宽参数化,对诉求排队和记录央浼日志,以及帮忙可收回的操作

后续完成多态,接口完毕多态。

(3)面向对象设计条件:

图片 48

A:开放密闭
B:注重倒置
C:单一任务
D:约束标准

===================================

(4)谈谈你对面向对象的明亮:

魔术点子:__toString():当大家输出贰个指标的时候,__toString()魔术点子会被机关调用,__toString()魔术点子供给重返以字符串。当大家的目的被视作函数的办法调用(即,在对象的援引前边加上左右括号(),来调用对象,也能够在调用对象的时候,向目的调用传递参数)的时候,会自行触发 __invoke() 魔术点子的调用。(通过func_get_args()函数可以获得调用函数时传递给函数的参数)。当调用贰个对象的未定义或不足访谈(比如:在类外界调用类的 private 方法)的章程的时候,__call()魔术点子会被电动调用,__call()魔术点子有多个参数:首个是未定义的点子名,第一个是给未定义的函数字传送递的参数内部以数组的款型保留),__call()魔术点子,也就是艺术的重载。__callStatic()魔术点子在用静态方式调用三个不行访问依然不设有的static方法时,会被自动调用,__callStatic()魔术点子一致有三个参数:第2个是未定义的章程名,第三个是给未定义的函数字传送递的参数(在__callStatic()内部以数组的花样保留)。__clone():私下认可景况下,将对象的援用直接赋值给贰个变量,是援用的赋值,七个都针对同多个指标。想得到四个同样的指标能够透过clone关键字完毕。通过clone关键字能够将一个对象的属性和方法完全复制一份赋给另一个指标,clone完成后会获得四个一律的独自对象,各自占用分化的内部存款和储蓄器空间,叁个指标的改造不会潜濡默化另贰个对象。当大家运用clone关键字的时候,自动会调用八个魔术点子__clone()。__sleep():类别号对象的时候会活动调用。__wakeup():反种类化对象的时候会自行调用。(系列化一个目的是指将三个指标转形成字节流的款式,那样就可以将对象保存在文件中。)

面向对象(OO)包蕴3局地内容
   面向对象分析(Object Oriented Analysis,OOA)
   面向对象设计(Object Oriented Design,OOD)
       面向对象编制程序(Object Oriented Programming,OOP),那是大家常说的面向对象编制程序

===================================

一种计算机编制程序框架结构  一切皆对象,相对于面向进程编制程序来讲进步了代码的可重用性。
面向对象的八个重大特色:封装、继承、多态,提升了系统的狡猾与健壮性

以下是进级篇的剧情:面向对象的规划条件,自动加载类,类型提醒,traits,命名空间,spl的行使,反射的行使,php常用设计方式

面向对象的中的属性和措施的可访谈性提升了程序的安全性,数据调取的比比皆是性.

1)封装性,也称之为音信掩盖。正是将叁个类的采纳和实现分开。只保留少数的接口与外界关系。使用者不必关切具体的兑现,只晓得各种方法的调用方式就可以
好处:制止了前后相继之间的注重。

2)承继性就是派生类(子类)自动延续父类中的属性和办法,并能够修改或增加新的性质和章程
瞩目:继承分单承继和多承接,php帮忙的是单承袭,二个子类只可以有三个父类。
好处:提升了代码的重用性。

承接的内幕
① 子类最三只好继续八个父类(指间接接轨)
② 子类能够继续其父类的public,protected修饰的习性和方法。
③ 在创制有个别子类对象时,暗中认可情形下不会自动调用其父类的构造函数。
④ 即便在子类中须求拜会父类中(以public/protected修饰)的不二秘籍,能够利用    父类::方法名恐怕是parent::方法名。
只要子类(派生类)中的方法和父类(基类)方法一致,大家称为方法重写/方法覆盖(后边解说)
3)多态即各种样子,具有表现三种样子的力量特征。在面向对象中表示遵照目标的等级次序以差异方法管理(说白了正是调用同二个艺术能够获得差异的结果)
利润:加强了软件的灵活性。

(5)什么是命名空间,怎么样申明和选拔:

取名空间是为着把一部分类和类的实例越来越好地保管而定义的把那么些类和实业群集起来的四个团队,它是_Namespace system class的一个实例,只怕是_Namespace类的八个派生类,_Namespace类唯有壹特性质:Name。通过这么些脾气客商能够把某部命名空间和任何的命名空间分开来,注意命名空间的Name不可能包罗头缀和后缀的下划线。
由首要字 namespace前边跟着命名空间名字,之后接一对花括弧括住的一块表明和定义;

(6)php class中static,pubic,private,protected 的区别?

public:权限是最大的,能够内部调用,实例调用等。
protected: 受爱抚项目,用于本类和承袭类调用。
private: 私有档期的顺序,独有在本类中央银行使。
static: 静态成员,无法实例化,有一点点像全局变量。

(7)类和对象

  类:具备同样属性和办法的东西的晤面,是虚幻的。
   对象:是类的实例化结果,是现实性的
     类和指标关系:类是目的的悬空,对象是类的实例化结果

   类的组合
    属性(也称变量或成员变量)
    方法(类中的函数被称呼方法或成员方法)
    常量  (不可能转移或收回定义)

   类的实例化
  类的应用:定义类之后,假如想行使类,一般需先实例化成对象。
    new 对象时:
    1. 报名内部存款和储蓄器,生成对象(属性和章程的集中)
    2. 如若有构造函数,则实践
        3. 赶回该指标的地址
例如:
$obj =  new  类名();      //为类实例化对象
echo $obj->属性名;       //调用输出类中定义的品质(属性名前平素不$符号)。
$obj->方法名();            //调用输出类中定义的不二秘籍
注意:除了属性和章程外,还应该有常量和静态成员。常量和静态能够直接通过类名访问

(8)面向对象高端:

(1)类常量
PHP中常量的法力:
  定义后不能够改变,能够免守被曲解。基于这一个特点,PHP常量相比较适合做程序调用的印证
  B:PHP中是何等定义常量?
  A:define('PAI',3.1415926);
类常量概念:定义在类里面包车型大巴常量
概念方式:类常量必得选用const关键字定义
const 常量名 = 值;

(2)静态成员   静态分为四个部分:静态属性和静态方法
注意:
静态方法中,只可以调用静态变量,而不能调用普通变量,但平常方法中能够调用静态变量
静态属性  定义静态属性:使用首要字static修饰的习性称之为静态属性。
静态方法     定义静态方法:使用static关键字修饰的办法叫做静态方法。
能用静态化解的主题素材,不用普通方法化解难题(静态的东西得以一贯动用类采访,无需通过对象实例化,因而节省了内部存储器空间,提高了作用)

极度注意:
严格遵照:静态的内容给类访谈,非静态的是给目的访问,不要跨界操作

总结:

    类  --> 访谈 --静态方法 :能够
    类  --> 访谈 --普通方法 :不得以   

    对象 --> 访谈 --静态方法: 能够
    对象 --> 访谈 --普通方法: 可以

(3)self与$this的区别

1)    self :代表本类,自己(不要精通为本类的指标),$this代表对象
2)    self访谈类内部的常量和静态成员,$this访谈对象的天性和平时方法
3)    self必得协作范围剖判操作符(::)能力奏效,$this代表对象,对象自然正是一种数据类型,所以$this能够独立被打字与印刷。
4)    能用$this的地方,一定能够行使self,可是能选取self的地点不自然能够动用$this
5)    非静态的性情和格局均用对象($this)访谈,静态的章程和品质或常量均用类(self)来做客

(4)访谈调控符
在性质或方法后面增加关键字 public(公有),protected(受保险)或 private(私    有)来兑现的。
瞩目:类属性的概念必得使用首要词。假设用 var 定义,则被视为公有
  有的类成员能够在其它省方被访谈。
  受保险的类成员则足以被其本人以及其子类和父类访问。
  私有的类成员则只可以被其定义所在的类访谈。

(9)时间戳管理函数
      time()
      date()
      strtotime()
      microtime()
      date_default_timezone_set()
      mktime()
 目录操作函数
   mkdir()
   rmdir()
   scandir()
   dirname()

basename() 返回路径中文件名部分
<?php
$path = "/home/httpd/html/index.php";
$file = basename($path);        // $file is set to "index.php"
$file = basename($path,".php"); // $file is set to "index"
?> 
pathinfo() 返回文件中路径的部分
<?php
$path_parts = pathinfo("/www/htdocs/index.html");
echo $path_parts["dirname"] . "n";
echo $path_parts["basename"] . "n";
echo $path_parts["extension"] . "n";
?> 
结果为:
/www/htdocs
index.html
html


 opendir() 
 readdir()
<?php
if ($handle = opendir('/path/to/files')) {
      echo "Directory handle: $handlen";
      echo "Files:n";
while (false !== ($file = readdir($handle))) {
        echo "$filen";
}
?>
closedir() 

递归删除目录
<?php
header("content-type:text/html;charset=utf-8");
//定义删除目录的函数
function deldir($path){
   //判断是否是正确目录
    if(is_dir($path)){
        //打开目录
        $ph=opendir($path);

        //循环读取目录结构
        while (false !== ($d = readdir($ph))) {
           // echo $d."<br>";
            if($d=='.'||$d=='..'){
                continue;
            }
            //拼接要删除的路径
            $tmp=$path."/".$d;
            //如果是文件就删除
            if(!is_dir($tmp)){
                unlink($tmp);
            }else{
                deldir($tmp);
            }
        }

        //关闭目录
        closedir($ph);
        //删除空目录
        rmdir($path);
    }else{
        echo "您所访问的目录不存在";
    }
}

//定义删除的目录
$path="F:/wamp/apache/htdocs/oop/1408phpf/day12/2015";
deldir($path);

 

本文由星彩网app下载发布于计算机编程,转载请注明出处:php面向对象,第二阶段

TAG标签: 星彩网app下载
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。