归纳概括PHP对象基础
发布时间:2022-07-09 13:04:14 所属栏目:PHP教程 来源:互联网
导读:实践学习php,thinkphp,Redis,vue,uni-app等技术,推荐开源电商系统likeshop,可以借鉴思路,可去版权免费商用,gitee下载地址: 点击进项目地址 面向对象:OOP(objected oriented programming)编程 面向过程是一种编程思想 面向对象编程的本质是增加数
|
实践学习php,thinkphp,Redis,vue,uni-app等技术,推荐开源电商系统likeshop,可以借鉴思路,可去版权免费商用,gitee下载地址: 点击进项目地址 面向对象:OOP(objected oriented programming)编程 面向过程是一种编程思想 面向对象编程的本质是增加数据和功能的操作主体,即对象 面向对象中的所有的数据和功能多是由主体(对象)来调用和操作 面向对象基础 面向过程和面向对象区别 image-20210130153514844 面向对象关键字 类:class,定义面向对象主体的最外层结构,用来包裹主体的数据和功能(函数) 对象:object,某类事务的具体代表,又称为实例 实例化:new,类产生对象的过程 类成员:member 方法:method,本质是在类class结构中创建的函数,称之为成员方法或者成员函数 属性:property,本质是在类class结构中创建的变量,称之为成员变量 类常量:const,本质是在类class结构中创建的常量 创建对象 <?phpclass People{}$man=new People();# 实例化类,man就是对象var_dump($man);?> # 输出object(People)#1 (0) { } #1表示:对象编号,与类无关,是整个脚本中对象的序号(0)表示:成员变量(属性)个数{}表示:具体成员变量信息(键值对) 类对象 <?phpclass Buyer{ # 常量声明 const BIG_NAME='BUYER'; # 常量不需要加 $ # 属性声明 # $name; # 错误的,类内部属性必须使用访问修饰限定符 public $name; public $money=0; # 方法声明 function display(){ echo __CLASS__; # 魔术常量,输出类名 # 方法内部变量属于局部变量 }}# 实例化$a = new Buyer();# 属性操作,增删改查echo $a->money;$a->money='20';$a->sex='male';unset($a->name);echo '<br>';# 方法操作$a->display();echo '<br>';var_dump($a);?> # 输出0Buyerobject(Buyer)#1 (2) { ["money"]=> string(2) "20" ["sex"]=> string(4) "male" } 注意:类常量不是由对象来进行访问 访问修饰限定符 在属性或者方法前的修饰关键字,用来控制属性或者方法的访问位置 public:公有,类内和类外都可以访问 protected:受保护,只允许在相关类内部访问 private:私有,只允许在定义类内部访问 属性必须有访问修饰限定符,方法可以没有访问修饰限定符,默认就是 public 类内部对象 $this,方法内部内置的一个对象,会自动指向来调用的方法的对象 $this 存在于方法内部(仅限内部使用),所以相当于在类的结构内部 可以访问任意访问修饰限定符修饰的成员 私有成员都是通过公有方法来实现访问(公有方法可以在类外部访问) <?phpclass Article{ protected $name = 'a'; private $type = 'art'; public function get_name() { var_dump($this); }}$a = new Article();var_dump($a);?> # 输出object(Article)#1 (2) { ["name:protected"]=> string(1) "a" ["type:private"]=> string(3) "art" } $this 代表的是对象,而 $this 所在环境为类内部的方法内部,所以 $this 对象是在类内部访问,因此所有的属性和方法,不受访问修饰限定符限制 image-20210201090314602 image-20210201090809302 image-20210201095446499 构造方法 __construct() 是一种系统内置的魔术方法,该方法的特性是在对象实例化之后,对象立即自动调用 构造方法的目的就是为了初始化资源,包括对象属性和其他资源 一旦构造方法定义好后,且构造方法自带参数,那么就只能使用 new 类名(参数列表) 方式才能正确实例化 魔术方法也可以通过对象直接调用的方式调用,不过没有实际用处 <?phpclass Article{ public $name='xiaoli'; private $sex="male"; public function __construct($name,$sex) { $this->name = $name; $this->sex = $sex; }}$a = new Article('xiaowang', 'famale');var_dump($a);?> 析构方法 __destruct(),对象在被销毁时自动调用,释放资源 对象销毁 对象无变量指向(变量指向其他数据) 对象被主动销毁(unset销毁对象变量) 脚本执行结束(自动释放资源) PHP 脚本执行结束会释放所有资源,所以一般较少用析构方法 <?phpclass Article{ protected $name = 'xiaoli'; private $sex = 'famale'; public function __destruct() { // TODO: Implement __destruct() method. echo __FUNCTION__; }}$a=new Article();# 销毁对象$a=1;unset($a);# __destructendecho 'end';?> # 不销毁对象,php在运行结束也会释放资源# end__destruct 对象传值 定义:将保存对象的变量赋值给另外一个变量 在 PHP 中,对象的传值是引用传递:即一个对象变量赋值给另外一个变量,两个变量指向同一个对象地址,即只有一个对象 <?phpclass Article{ public $name = 'xiaoli'; public $sex = 'famale';}$a=new Article();$b=$a;var_dump($a,$b);echo '<br>';$a->name="wangxiaohu";var_dump($a,$b);echo '<br>';?> # 输出object(Article)#1 (2) { ["name"]=> string(6) "xiaoli" ["sex"]=> string(6) "famale" } object(Article) #1 (2) { ["name"]=> string(6) "xiaoli" ["sex"]=> string(6) "famale" }object(Article) #1 (2) { ["name"]=> string(10) "wangxiaohu" ["sex"]=> string(6) "famale" } object(Article) #1 (2) { ["name"]=> string(10) "wangxiaohu" ["sex"]=> string(6) "famale" } 范围解析操作符(类常量访问) 有两个冒号组成 “::” ,专门用于类实现类成员操作,可以实现类直接访问类成员 范围解析操作符是用于给类(类名)访问类成员使用的 类名::类成员 范围解析操作符也可以被对象用来当作类使用(不建议) $对象名::类成员 类常量只能被类访问 <?phpclass Article{ const NAME='ocean';}echo Article::NAME; # 常量是不能通过 Article->NAME 来进行访问的$a=new Article();echo $a::NAME; # 范围解析操作符兼容对象,找到对象所属类最终进行访问,效率降低,灵活性提高?> 类常量是固定的,而对象的属性是不同对象不同的 image-20210201115041335 静态成员 定义:使用 static 关键字修饰的类成员,表示该成员属于类访问 静态成员 静态属性 静态方法 静态成员是明确用来给类访问的,而不是对象 静态成员只是多了一个 static 关键字修饰,本身也可以被对象访问 静态成员同样可以使用不同的访问修饰限定符限定,效果一致 image-20210201133428850 <?phpclass Article{ public static $name = 'hlm'; public static $type = 'art'; public static function getName() { return self::$name; }}# 静态属性$a = new Article();echo Article::$name;# 静态方法echo Article::getName();?> self关键字 在类的内部(方法里面)使用,代替类名的写法 self 如同 $this 代表内部对象一样,能够在方法内部代替当前类名 能够保障用户方便修改类名字 self 关键字是代替类名,所以需要配合范围解析操作符 :: <?phpclass Article{ public static function getInstance1() { return new self(); } public static function getInstance2() { return new Article(); }}$a = Article::getInstance1();$b = Article::getInstance2();var_dump($a,$b);?> # 输出object(Article) #1 (0) { } object(Article) #2 (0) { } 类加载 类的访问必须保证类在内存中已经存在,所以需要再用类之前将类所在的 PHP 文件加载到内存中 类的加载分为两种 手动加载:在需要使用类之间通过 include 将包含类的文件引入到内存 自动加载:提前定义好类结构和位置,写好引入类文件代码,在系统需要类而内存不存在的时候想办法让写好的加载类的代码执行(自动加载是自动运行写好的加载类的代码) 自动加载两种方式 魔术函数 __autoload:系统自动调用,需要传入类名,在函数内部实现类的手动加载(PHP7及之后不建议使用此方法) function __autoload($classname){ # 找到对应的文件路径和命名规范,手动加载} 自定义函数:自己定义类的加载实现,然后通过 spl_autoload_register 注册到自动加载机制(可注册多个自动加载) # 自定义类加载函数function 自定义函数($classname){ # 找到对应的文件和命名规范,手动加载}#注册自动加载sql_autoload_register('自定义函数名字') 自动加载要求在声明类的时候有良好的规范 类名与文件名一致:类名.php 或者 类名.class.php (编辑:开发网_郴州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


浙公网安备 33038102330466号