面向对象
(1) class Person{ public $name='zhang';//添加成员 public function fn(){//添加方法 echo 111; } const txt="hello";//添加常量 } $p=new Person; echo $p->name;//这个是访问属性 echo $p->name=456;//这个是赋值 echo $p->fn();//这个是访问方法echo Person::txt;//访问常量(2)class Person{ public $name="zhang"; public function fn(){ echo 111; } const txt="hello";}$p=new Person;echo $p->name;echo $p->name=456;$p->fn();echo Person::txt;(3)变量a和变量p都指向同一个引用地址,二者是同一个对象 ,一遍都变思考:如果让二者是两个不同的对象,改变a但是p不跟着改变。需要使用对象克隆 cloneclass Person{ public function fn(){// public $name=123;// echo $this->name;// var _dump($this); }}$p=new Person;$p=new Person;$p->fn();//$thjis指向调用他的那个对象$a=$p;$a->name=456;echo $p->name;变量a和变量p都指向同一个引用地址,二者是同一个对象 ,一遍都变思考:如果让二者是两个不同的对象,改变a但是p不跟着改变。需要使用对象克隆 clone通过关键字 clone来赋值一个一模一样的对象<!--使用关键字class定义类和new实力恶化对象--><!--类成员的添加和访问--><!--类成员 。。有属性 方法 常量--><!--添加属性 需要使用范围修饰符 public 所有protected内类子类 private类本身--><!--访问属性的时候变量名不带$符号--><!--作用范围 类外 类内 子类 public 都可以访问--><!--protected在类内和子类内访问--><!--private只能在自己的类内访问-->abstract class p{ public $age; abstract public function ff($na); abstract public function fn();}class son extends p{ public function ff($na){ echo $na; } public function fn(){ }}$pp=new son;$pp->ff(23);interface pp{ public function ff(){ }}class ss implements pp{ public function ff(){ }}?> 面向对象1.使用关键字class定义类和new实列化对象2.类成员的添加和访问类成员 。。有属性 方法 常量添加属性 需要使用范围修饰符 【public 所有 protected内类子类 private类本身】访问属性的时候变量名不带$符号作用范围 类外 类内 子类 public 都可以访问protected在类内和子类内访问private只能在自己的类内访问添加方法 如果方法前不带修饰符 则默认是 public添加常量 使用关键字const常量名。 常量名不带$符号访问常量 类名 常量名。。。。范围解析符<?php class Person{ public $name='zhang';//添加成员 public function fn(){//添加方法 echo 111; } const txt="hello";//添加常量 } $p=new Person;echo $p->name;//这个是访问属性 echo $p->name=456//这个是赋值 $p->fn;//这个是访问方法echo Person::txt;访问常量?>3.类内部对象$this和内存原理$this他是一个对象,指向实列化的那个对象当我们new实例化的时候,系统会给这个对象分配一个内存空间,内存空间分一个栈内存,一个堆内存,将变量存在栈里,将代码块存在堆里,然后将堆的内存地址指向栈中的变量,如果再给这个栈中的变量赋值引用数据类型,那么这个内存地址就会被更改。4.变量a和变量p都指向同一个引用地址,二者是同一个对象 ,一遍都变思考:如果让二者是两个不同的对象,改变a但是p不跟着改变。需要使用对象克隆 clone通过关键字 clone来赋值一个一模一样的对象class Person{ public function fn(){// echo $this->name; var _dump($this); }}$p=new Person;//$p=new Person;//$p->fn();//$thjis指向调用他的那个对象$a=$p;$a->name=456;echo $p->name;5构.造函数和析构函数构造函数,我们在声明类的时候就自然存在,当用new实列的时候,这个函数就会自动调用 我们也可以人为去写些自己的东西,析构函数,用于销毁new实列化的内存,如果不销毁内存,系统性能会大大降低。new实列化以后,这个函数也会自动调用,销毁原则是先入后出静态成员的添加静态成员的访问在程序员属性前面加上 static关键字就可以了6.静态访问第一种在类的内部方法中方位在类的外部访问7.面向对象的三大特征封装 对外只告诉你如何操作 ,内部节后你不许用知道。对外只提供可操作的接口 ,对内的数据操作不可见。继承子类继承父类的属性和方法,但是有限继承多态:php没有多态,因为php是弱类型语言 ,不会对变量提前进行类型声明。但是有重载重载 父类和子类方法相同 子类会覆盖父类的方法。8.关键字parent在继承中的子类有这个parent 访问父类的常量 父类的方法 父类的静态属性 属性成员不能访问。9.final关键字 不可继承的如果写在类的前面。表明这个类不能被继承。如果写在类的方法前面和属性的前面 说明这个方法和属性也不能被重载10.abstract代表抽象类如果项目经理需要对所有的子类进行规范,就是说有些程序员必须有,且必须使用那些名字。就需要使用抽象类这个概念 1.抽象类不能被实列化 2.如果一个类里面有一个方法被声明为抽象类了,这个类就得声明为抽象类; 3.只要这个方法被声明为抽象的方法了就不能写函数体 将函数后面{}去掉。 4.函数体由子类去实现。 5.在继承一个抽象类的时候,子类必须定义父类中的所有抽象方法。不是抽象方法abstract class p{ public $age; abstract public function ff($na); abstract public function fn();}class son extends p{ public function ff($na){ echo $na; } public function fn(){ }}$pp=new son;$pp->ff(23);11.接口 interface接口的用途和抽象类差不多 都是为了写一些规范1.使用interface关键字定义接口 接口在方法都是空的没有函数体2.接口中的所有方法都是public3.使用implements这个操作符4.实现多个接口,接口不能重名1接口使用 implements 而抽象类使用extends实现2接口中只能申明公有的方法 抽象的方法3接口没有构造函数 抽象类有4接口可以实现多个接口 ,但是抽象类只能继承1个5接口和接口之间方法尽量不要重名 如果重名了 name参数等要保持一致。转载于:https://www.cnblogs.com/yangjingyang/p/10679050.html