php面向对象final怎么设置(PHP面向对象程序设计中的self、static、parent关键字用法分析)
php面向对象final怎么设置
PHP面向对象程序设计中的self、static、parent关键字用法分析本文实例讲述了PHP面向对象程序设计中的self、static、parent关键字用法.分享给大家供大家参考,具体如下:
看到php里面有关于后期静态绑定的内容,虽然没有完全看懂,但是也收获不少东西。
php官方手册介绍:
http://php.net/manual/zh/language.oop5.late-static-bindings.php
不存在继承的时候
不存在继承的意思就是,就书写一个单独的类来使用的时候。self和static在范围解析操作符 (::) 的使用上,并无区别。
- 在静态函数中,self和static可以调用静态属性和静态函数(没有实例化类,因此不能调用非静态的属性和函数)。
- 在非静态函数中,self和static可以调用静态属性和静态函数以及非静态函数
此时,self和static的表现是一样的,可以替换为该类名::的方式调用。
|
<?php class Demo{ public static $static ; public $Nostatic ; public function __construct(){ self:: $static = "static" ; $this ->Nostatic = "Nostatic" ; } public static function get(){ return __CLASS__ ; } public function show(){ return "this is function show with " . $this ->Nostatic; } public function test(){ echo Demo:: $static . "<br/>" ; //使用类名调用静态属性 echo Demo::get(). "<br/>" ; //使用类名调用静态属性 echo Demo::show(). "<br/>" ; //使用类名调用静态属性 echo self:: $static . "<br/>" ; //self调用静态属性 echo self::show(). "<br/>" ; //self调用非静态方法 echo self::get(). "<br/>" ; //self调用静态方法 echo static :: $static . "<br/>" ; //static调用静态属性 echo static ::show(). "<br/>" ; //static调用非静态方法 echo static ::get(). "<br/>" ; //static调用静态方法 } } $obj = new Demo(); $obj ->test(); |
输出结果:
static
Demo
this is function show with Nostatic
static
this is function show with Nostatic
Demo
static
this is function show with Nostatic
Demo
继承的时候
在继承时,self和static在范围解析操作符 (::) 的使用上有差别。parent也是在继承的时候使用的。
|
<?php class A{ static function getClassName(){ return "this is class A" ; } static function testSelf(){ echo self::getClassName(); } static function testStatic(){ echo static ::getClassName(); } } class B extends A{ static function getClassName(){ return "this is class B" ; } } B::testSelf(); echo "<br/>" ; B::testStatic(); |
输出结果:
this is class A
this is class B
self调用的静态方法或属性始终表示其在使用的时候的当前类(A)的方法或属性,可以替换为其类名,但是在类名很长或者有可能变化的情况下,使用self::的方式无疑是更好的选择。
static调用的静态方法或属性会在继承中被其子类重写覆盖,应该替换为对应的子类名(B)。
parent关键字用于调用父类的方法和属性。在静态方法中,可以调用父类的静态方法和属性;在非静态方法中,可以调用父类的方法和属性。
|
<?php class A{ public static $static ; public $Nostatic ; public function __construct(){ self:: $static = "static" ; $this ->Nostatic = "Nostatic" ; } public static function staticFun(){ return self:: $static ; } public function noStaticFun(){ return "this is function show with " . $this ->Nostatic; } } class B extends A{ static function testS(){ echo parent::staticFun(); } function testNoS(){ echo parent::noStaticFun(); } } $obj = new B(); $obj ->testS(); echo "<br/>" ; $obj ->testNoS(); |
输出结果
static
this is function show with Nostatic
在文章的最后,我们分析一个手册上的例子
|
<?php class A { public static function foo() { static ::who(); } public static function who() { echo __CLASS__ . "\n" ; } } class B extends A { public static function test() { A::foo(); parent::foo(); self::foo(); } public static function who() { echo __CLASS__ . "\n" ; } } class C extends B { public static function who() { echo __CLASS__ . "\n" ; } } C::test(); ?> |
输出结果
A
C
C
我们单独拿出test方法进行分析:
|
public static function test() { A::foo(); parent::foo(); self::foo(); } |
1)A::foo();
这个语句是可以在任何地方执行的,它表示使用A去调用静态方法foo()得到'A'。
2)parent::foo();
C的parent是B,B的parent是A,回溯找到了A的foo方法;static::who();
语句中的static::调用的方法会被子类覆盖,所以优先调用C的who()方法,如果C的who方法不存在会调用B的who方法,如果B的who方法不存在会调用A的who方法。所以,输出结果是'C'。[注1]
3)self::foo();
这个self::是在B中使用的,所以self::等价于B::,但是B没有实现foo方法,B又继承自A,所以我们实际上调用了A::foo()
这个方法。foo方法使用了static::who()
语句,导致我们又调用了C的who函数。[注2]
注1:补充解释上面的(2)
|
<?php class A { public static function foo() { static ::who(); } public static function who() { echo __CLASS__ . "\n" ; } } class B extends A { public static function test() { A::foo(); parent::foo(); self::foo(); } public static function who() { echo __CLASS__ . "\n" ; } } class C extends B { // public static function who() { // echo __CLASS__."\n"; // } } C::test(); ?> |
输出结果:
A B B
注2:补充解释上面的(3)
|
<?php class A { public static function foo() { static ::who(); } public static function who() { echo __CLASS__ . "\n" ; } } class B extends A { public static function test() { A::foo(); parent::foo(); self::foo(); } public static function foo() { echo "fooB" . "\n" ; } public static function who() { echo __CLASS__ . "\n" ; } } class C extends B { public static function foo() { echo "fooC" . "\n" ; } public static function who() { echo __CLASS__ . "\n" ; } } C::test(); ?> |
输出结果:
A C fooB
希望本文所述对大家PHP程序设计有所帮助。
原文链接:https://blog.csdn.net/koastal/article/details/52166246
- php网站经典案例(PHP生成短网址的思路以及实现方法的详解)
- php实现非递归快速排序(PHP实现无限极分类的两种方式示例递归和引用方式)
- php项目开发实例(php项目中类的自动加载实例讲解)
- php生命周期表(PHP中md5函数的用法讲解)
- php7内核剖析(浅析PHP7的多进程及实例源码)
- thinkphp微信开发实例(ThinkPHP框架下微信支付功能总结踩坑笔记)
- php执行语句(PHP goto语句用法实例)
- php使用面向对象如何写好代码(PHP面向对象程序设计模拟一般面向对象语言中的方法重载overload示例)
- php环境搭建windows系统(Windows环境下安装PHP Pear的方法图文教程)
- webapp前端能用yii2开发吗(Yii Framework框架使用PHPExcel组件的方法示例)
- php 获取get url(PHP实现获取url地址中顶级域名的方法示例)
- 如何用wampserver打开自己写的php(WampServer下安装多个版本的PHP、mysql、apache图文教程)
- php数据类型图解(php使用filter_var函数判断邮箱,url,ip格式示例)
- 排序算法口诀php(PHP快速排序算法实现的原理及代码详解)
- thinkphp框架实例(ThinkPHP框架整合微信支付之JSAPI模式图文详解)
- php联合注入列表总结(php中的依赖注入实例详解)
- 提醒 2019年起河南驾考要开设科目五 官方回应来了(2019年起河南驾考要开设科目五)
- 省 市书法家协会 送万福进万家 活动走进禹州美丽乡村(省市书法家协会)
- 点赞 禹州苌庄正式撤乡建镇 未来发展不可估量(禹州苌庄正式撤乡建镇)
- 它荣获 中国生态魅力镇 称号 就在咱们禹州,一起来看看(中国生态魅力镇)
- 真牛 禹州将建成中等城市(禹州将建成中等城市)
- 被骂欺师灭祖,与郭德纲公开叫板,何云伟改名何沄伟,开始画画了(与郭德纲公开叫板)
热门推荐
- thinkphp6.0安装(使用composer安装使用thinkphp6.0框架问题视频教程)
- jspromise原理(JavaScript使用promise处理多重复请求)
- wampserver如何使用(WampServer打开xdebug功能方法教程)
- 网站如何提高用户体验
- apache服务配置详解(apache配置开启网站服务步骤)
- dedecms文章标题(dedecms5.7后台发布文章提示“标题不能为空”的解决方法)
- dedecms手册教程(dedecms标签大全非常经典)
- jquery如何优化
- 开启wds点击保存没有反应(WDCP控制面板打开空白或无法登录的解决办法)
- laravel入门教程零基础(Laravel5.7框架安装与使用学习笔记图文详解)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9