【类和对象的基本使用】
类的声明
调用 属性、方法
//声明类 class Cat { 定义属性 public $name = '咪咪'; $sex = null定义方法 public function jiao() { echo '喵喵~'; } } 实例化 $c1 = new Cat(); var_dump($c1); 调用 属性、方法 echo $c1->name; jiao(); $c1->sex = '母'; $c1->sex;
传递赋值和引用赋值
$a = 'abc'; $b = $a;传递赋值 $c = &引用赋值 $a);abc $b);$c);abc $a = 'qq'; qq qq
对象的传递赋值
MyClass { $str = 'abc'; } $a = new MyClass(); $a 存的是对象的标识符 传递赋值 把标识符 赋值给 $b $str = 'abc' $str = 'abc' $a->str = '456';对象的属性改变了 //$a $b 存的 仍是 对象标识符 str = '456' str = '456' $a = 123int 123 对象标识符str = '456'
对象的引用赋值
$b = &引用赋值 把$a的引用 赋值给 $b str = 'abc' str = 'abc' $a->str = '123'str = '123' str = '123' int 123
【封装】
访问控制 public protected private
$a = 'public'protected $b = 'protected'private $c = 'private'; test() { 类内部调用 $this->a;public $this->b;protected $this->c;private } } $obj = MyClass; 类外 以 对象的方式调用 $obj->a;public $obj->b;报错 $obj->c;报错 $obj->test();
构造函数:对象被实例化时调用
__construct() { echo '调用了__construct <br>'; } } $obj1 = new MyClass;调用了__construct $obj2 = new MyClass();调用了__construct
析构函数:对象被销毁时调用
__destruct() { echo '对象被销毁了' MyClass(); null;对象被销毁了 unset($obj);exit('结束掉');结束掉对象被销毁了
静态属性与静态方法 static
static $a = 'static'$b = '123123'static func1() { echo '静态方法调用'; echo MyClass::$aecho self::echo '<hr>'; MyClass::func2(); ; self::不可以用$this去调用 //echo $this->$a;//Fatal error //$this->func2(); } func2() { echo 'this is static func2'; } func3() { echo 'this is func3'echo '静态属性'echo MyClass::echo self::func2(); echo $this->a;//去调用静态属性 失败 $this->func2(); } } $b;非静态调用失败 MyClass::func1(); MyClass(); 对象使用-> 去调用静态属性 失败 $obj->b; func1(); $obj->func3();
常量const
const NUM = 123; } NUM; MyClass::$a = 'def'; MyClass::NUM = 456; 报错,常量一经定义不能修改
属性的重载:不可访问的属性
Person { $name='小芳'$age=18;protected不可在外部访问 //触发了不可访问的属性 function __get($n) { if($n == 'age'){ return age; }else{ return '瞎问什么啊'; } } function __set($n,$vecho '触发了设置不可访问的属性'.$n.'值为'.; $this->$n = function __isset(echo '判断一个不可访问的属性是否存在'.function __unset(echo '销毁一个不可访问的属性'.; } } $xiao = Person(); $xiao->age;18 $xiao->xxx;瞎问什么啊 $xiao->age = 11;设置不可访问的属性age值为11 11 isset($xiao->age);判断一个不可访问的属性是否存在age 销毁一个不可访问的属性age 判断一个不可访问的属性是否存在age
方法重载:不可访问的方法
MyClass { protected function func(echo '这是一个不可访问的方法'echo '参数是'.function __call($name,1)">$argecho '触发了不可访问的方法'$name);方法名称 func $arg);参数 // array(2) { // [0] => // string(3) "aaa" // [1] => // int(123) // } } echo '受保护的静态方法'function __callStatic(echo '调用了不可访问的静态方法'func2 ); array(4) { // [0] => // int(1) // [1] => // int(2) // [2] => // int(3) // [3] => // int(4) // } } } MyClass(); $obj->func('aaa',123触发了不可访问的方法 MyClass::func2(1,2,3,4调用了不可访问的静态方法
【继承】
类的继承
FatherClass { echo 'public func'echo 'protected func'private echo 'private func'; } } class SonClass extends test() { $this->func1();public方法可以被继承 $this->func2();protected方法可以被继承 //$this->func3();//Fatal error:private方法不可以被继承 SonClass(); public //echo $obj->b; //fatal error //echo $obj->c; //Notice //$obj->func1(); //$obj->func2(); //fatal error //$obj->func3(); //fatal error test(); public func protected func
类的重写
Father { shuo() { echo 'a a o o'class Son echo 'hello'shuo(); parent::shuo(); } } Son(); $obj->shuo();hello $obj->test();helloa a o o
final 修饰类 则该类不能被继承
final function test() final 声明之后不能被重写 { Father { echo '你好'报错
【多态】
抽象类abstract
abstract MyAbsClass { $name = '张三'$age; } func(); } class ChildClass func() { } } MyAbsClass { }
接口interface
interface MyInterface { func(); test(); } class MyClass implements func(){ } test(){ class MyAbsClass test(); }
【条件约束和自动加载】
接口的继承
Ainter { interface Binter test(); } Binter { test() { } func() { } }
判断是否属于某个类的实例
A { class B class C B { func() { echo 'ok'class D echo '好的'/* B实现了 A C、D继承自B C、D是兄弟 */ C(); D(); $arr = [1,3]; 是否属于D的实例 function test(D ) { ; } 是否属于A的实例 function test2(A ; } test($obj2);ok //test($obj1);//不属于D的实例 test2($obj1);ok test2(ok
自动加载__autoload
function __autoload(include 'myclassfolder/'.$a.'.class.php'; } class A B { }
注册自动装载函数
function myloader( 有三个参数 参数1:需要注册的自动装载函数 参数2: 如果没有找到参数1的函数 是否抛出异常错误 参数3: 是否把参数1的函数添加到队列之首 */ spl_autoload_register('myloader',true,1)">true B { }
注册自动装载类
MyLoader { function l(; } } ['MyLoader','l'] //spl_autoload_register 第一个参数以数组方式传入 spl_autoload_register(['MyLoader','l'],1)"> B { }
初始化时自动装载
init(){ $this,1)">); } } MyLoader(); init(); B { }
【命名空间】
命名空间(函数案例)
namespace A; function time(){ echo 'my time function <br>'; } namespace B; echo 'my space B time function <br>'time(); namespace B time() \A\ namespace A time() \B\ namespace B time() echo \time(); \全局空间
命名空间(类案例)
namespace A\B; echo '空间A\B 中的类 实例化了 <br>'; } } namespace A; echo '空间A 中的类 实例化了 <br>' 非限定名称 new \A\B\MyClass(); 完全限定名称 new \A\MyClass();new B\MyClass();限定名称
打印当前命名空间
echo __NAMESPACE__;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。