对象:任何东西都可以称为对象,类实例化出来的东西
类:对所有同类的对象抽象出来的东西
Info: Code,Name,Sex,Nation,Birthday
对象:一条具体的信息 p001 张三 男 汉族 1990-2-3
定义类:
class Ren { public $Name; //成员变量 protected $age; private $height; var $sex; //一般不要给成员变量赋值 function __construct($s) //构造函数 { $this->sex = $s; } function __destruct() //析构函数,对象销毁前执行 { echo "该对象销毁了!"; } function Run() //成员函数(方法) { echo "这个人正在奔跑!"; } function Say() { echo $this->Name."正在说话!"; } }
//使用类 //1.实例化对象 $r = new Ren("男"); //2.给成员变量赋值(调用成员变量) $r->Name = '张三'; //给对象的Name赋值 echo $r->age; var_dump($r); //3.调用成员方法 $r->Run(); $r->Say(); //执行成员方法 //访问修饰符 //1.如果要加访问修饰符,需要去掉var //2.三种:public公有的 protected受保护的 private私有的 //3.如果不加访问修饰符,默认是public //$this引用 //$this代表该对象(哪个对象调用),不是代表该类 //构造函数 //1.写法特殊:__construct(),双下划线 //2.执行特殊:在造对象的时候最先执行 //作用:对对象进行初始化操作
面向对象三大特性: 封装,继承,多态
1.封装
目的:让类更加安全,不让外界直接访问类里面的成员变量
做法:1.把成员变量做成私有的
2.做一个方法来实现变量取值或赋值,在方法里面加限制条件
class Ren { private $name; private $sex; private $age; function SetAge($a) //给age赋值的函数 { if($a>10 && $a<50) { $this->age = $a; } } function GetAge() //取age的值 { return $this->age; } } $r = new Ren("男"); $r->SetAge(40); echo $r->GetAge();
使用类里面提供的魔术方法也可以实现对私有成员的操作
__set()特点:会自动执行,把赋值语句中的变量名作为第一个参数,把变量值作为第二个参数调用__set方法
__get()特点:会自动执行,把取值语句中的变量名作为参数调用__get方法
function __set($name,$value) //对类里面的私有成员进行赋值的魔术方法 { if($name == "age") { if($value>20 && $value<50) { $this->$name = $value; } } else { $this->$name = $value; } } function __get($name) //对类里面的私有成员进行取值的魔术方法 { return $this->$name; }
$r->__set("name","张三"); $r->name = "李四"; //执行该语句会自动调用__set方法 $r->sex = "女"; $r->age = 40; var_dump($r); echo $r->__get(age);
2.继承
如果要继承,就必须有子类
概念: 如果一个类有子类,那么该子类会继承父类的一切东西(私有的成员访问不到)
做法: 在定义子类的时候需加一个关键字 extends
特点: 单继承,一个儿子只能有一个父亲,一个类只能有一个父类
如果父类中有构造函数,那么子类在实例化的时候需要依照父类构造函数的标准来实例化
子类对父类方法的重写: 在子类中写一个同样的方法
final: 用来修饰类,代表该类是一个最终类,该类无法被继承
class Test extends Ren //Test是Ren的子类 { public $birthday; //子类可以加入自己的东西 function run() { echo "run"; } function Say() { parent::Say(); //调用父类的Say()方法 parent双冒号,只能在子类中使用 echo " Test say"; } } $t= new Test("女"); $t->code ="p001"; var_dump($t); $t->Say(); //子类对父类方法的重写
静态成员
类里面的普通成员是属于对象的,不是属于类的(调用的时候使用对象调用)
什么是静态的: 类静态成员是属于类的,不是属于每个对象的
定义静态成员用关键字static
静态方法里面无法调用普通成员
静态方法可以调用静态成员,使用self关键字调用
self代表该类用::调用,$this代表该对象,用->调用
class Ren { const π=3.1415926; //将某些类里面常用到的东西定义为常量, 关键字const public static $class; //static关键字是定义静态的 public $code; private $name; private $sex; private $age; function __construct($s) { $this->sex = $s; } public function Say() { echo self::$class; //普通方法可以调用静态成员 echo "hello"; } static function Test() //静态方法 { echo self::$class; //调用自身类里面的静态成员 echo "静态方法!"; } }
$r =new Ren("女"); Ren::$class = "0305"; echo Ren::$class; //访问静态成员用双冒号 Ren::Test(); $r->Say();
子类中也可以用静态成员与静态方法:
class Test extends Ren //Test是Ren的子类 { public $birthday; //子类可以加入自己的东西 public static $shengao; function run() { echo "run"; } function Say() { parent::Say(); //调用父类的Say()方法 parent双冒号,只能在子类中使用 echo " Test say"; } static function aa() { echo "子类中能用静态方法吗?"; } } $t= new Test("女"); Test::$shengao ="170"; echo Test::$shengao; Test::aa();