面向对象
(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不跟
着改变。需要使用对象克隆 clone
class 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.接口中的所有方法都是public
3.使用implements这个操作符
4.实现多个接口,接口不能重名
1接口使用 implements 而抽象类使用extends实现
2接口中只能申明公有的方法 抽象的方法
3接口没有构造函数 抽象类有
4接口可以实现多个接口 ,但是抽象类只能继承1个
5接口和接口之间方法尽量不要重名 如果重名了 name参数等要保持一致。