php分享二十二:php面向对象
1:static访问符
- 在类中使用static有两种主要用途、定义静态成员和定义静态方法。静态成员只保留一个变量的值,这个值对所有实例都是有效的
- 类的方法是static的,他所访问的属性也必须是static的
2:static后期静态绑定
什么是静态绑定?
abstract class U { }
class u1 extends U {
public static function create() {
return new u1();
} }
class u2 extends U {
public static function create(){
return new u2();
}
}
这段代码正常工作是没问题,但大量重复的代码会很烦人
我不想在每个子类中添加create方法,如果把create方法放在超类U中,代码可能是
abstract class U
{
public static function create()
{
//return new self(); //self 会报错,self对该类所起的作用与$this对对象所起的作用并不完全相同。self指的不是调用上下文,他指的是解析上下文,
//因此如果运行上面的列子,将会得到
//Fatal error: Cannot instantiate abstract class U in D:wampwwwtestoopstatic.php on line 21
//因此self被解析为定义create的U,而不是解析为调用self的u1类。 //static不仅可以用于实例化,和self,parent一样还可以作为静态方法的调用标识符,甚至是从非静态上下文中调用
return new static();
} } class u1 extends U{ } class u2 extends U{ }
$res = u1::create();
var_dump($res);
static不仅可以用于实例化,和self,parent一样还可以作为静态方法的调用标识符,甚至是从非静态上下文中调用
abstract class U
{
private $group;
public function __construct()
{
$this->group = static::getGroup();
} public static function create()
{
return new static();
} static function getGroup()
{
return 'default';
} } class u1 extends U
{ } class u2 extends U
{
static function getGroup()
{
return 'u2';
} } class u3 extends u2
{ } print_r(u1::create());
u1 Object ( [group:U:private] => default )
u3 Object ( [group:U:private] => u2 )
例子:
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(); //如果换成static,则向后绑定,如果是A,则最底层的类是A
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
3: 属性不能被定义为 final,只有类和方法才能被定义为 final。
如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。
4:对象复制
5:对象继承
parent能调用父类的非静态方法吗?
self能调用父类的静态方法吗?
php支持继承多个类吗?
父类调用之类怎么调用?
子类调用父类怎么调用?
$this能调用静态方法吗?
同样的类名和接口名可以放在一起吗?
子类的同名访问符可以小于父类的吗?
php支持多态吗?
1> parent能调用父类的非静态方法吗?
parent既能调用父类的静态方法,也可以调用父类的非静态方法; parent不可以调用子类,只能调用父类的; parent关键字解决的就是调用父类的方法;
self无论父类还是子类的静态方法,非静态方法都可以调用(对所有的无限制)
parent常用于构造函数中调用父类的构造函数
2>self能调用父类的静态方法吗?
3>父类调用之类怎么调用?
静态方法,属性用static,$this(虽然可以访问,但是不建议这样来做)
非静态方法,属性用$this, static
4>子类调用父类怎么调用?
用$this, parent, static
5>如果子类和父类有相同的方法,但是父类的是private方法,父类调用的时候调用的是哪个方法?
父类调用的是他自己的,而不是子类的。对于私有方法(private)修饰的方法,$this找的方法是先找本类里的。 protect,public都可以被覆盖。
class Child
{
public function __construct()
{
$this->setInstance($this);
} private function setInstance($instance)
{
echo 'Child';
}
} class ChildChild extends Child
{ public function __construct()
{
parent::__construct();
} public function setInstance($instance)
{
echo 'ChildChild';
}
}
$obj = new ChildChild();
输出:Child 【因为他是private,$this调用的时候调用它】
如果改成public,或protected,则返回ChildChild
5>子类的同名访问符可以小于父类的吗?
子类的修饰符号不能小于父类的
3>同样的类名和接口名不能放在一起。
同样的类名和接口名可以放在一起吗?
Class and Interface share SAME namespace!
class k{}
interface k {} // Fatal error: Cannot redeclare class k
6:$this, self,parent,static
1> $this访问变量不加$, self:: 访问需要加
$this->name; self::$sName;
2>
$this能访问静态变量,静态方法,但是不能访问常量;
而self, parent, static 不能访问非静态变量,只能访问静态的变量或常量; 但是self,parent,static都能访问非静态方法。self也能访问父类的非静态方法和静态方法。
php支持多态吗?
多态:多个函数用同一个名字,但参数表,即参数的个数或(和)数据类型可以不同,调用的时候,虽然方法名字相同,但根据参数表可以自动调用对应的函数。
PHP只支持覆盖(override),而不支持重载(overload)。
PHP5 中重载可以通过 __get, __set, and __call 几个特殊方法来进行。当 Zend 引擎试图访问一个成员并没有找到时,PHP将会调用这些方法。
public function __call($method, $p)
{
print("Invoking $method()<br>\n");
if($method == 'display')
{
if(is_object($p[0]))
$this->displayObject($p[0]);
else
if(is_array($p[0]))
$this->displayArray($p[0]);
else
$this->displayScalar($p[0]);
}
}
__CLASS__, __FUNCTION__ 在哪个类里,就显示哪个,而不管$this是谁
class Child
{
public function __construct()
{
static::setInstance($this);
}
} class ChildChild extends Child
{ public function __construct()
{
parent::__construct();
} public function setInstance($instance)
{
echo __CLASS__ . ' || ' . __FUNCTION__;
echo 'childChild';
}
}
$obj = new ChildChild();
返回: ChildChild || setInstance childChild
static访问符号的顺序为: 从后往前
子类 > 本类 > 父类
class Base
{
protected static $instances; public function setInstance($instance)
{
echo 'Base';
}
}
class Child extends Base
{
public function __construct()
{
static::setInstance($this);
} public function setInstance($instance)
{
echo 'Child';
}
} class ChildChild extends Child
{
public function setInstance($instance)
{
echo 'ChildChild';
}
}
$obj = new ChildChild();
输出: ChildChild
总结:
访问静态方法,静态属性:static,parent,self, $this
访问常量: self, parent, static
访问非静态方法,属性: $this, static, parent, self
子类访问父类: $this, parent, self, static
父类访问子类: static, $this
php分享二十二:php面向对象的更多相关文章
- AngularJs的UI组件ui-Bootstrap分享(十二)——Rating
Rating是一个用于打分或排名的控件.看一个最简单的例子: <!DOCTYPE html> <html ng-app="ui.bootstrap.demo" x ...
- [分享] IT天空的二十二条军规
Una 发表于 2014-9-19 20:25:06 https://www.itsk.com/thread-335975-1-1.html IT天空的二十二条军规 第一条.你不是什么都会,也不是什么 ...
- Web 前端开发精华文章推荐(HTML5、CSS3、jQuery)【系列二十二】
<Web 前端开发精华文章推荐>2014年第一期(总第二十二期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML ...
- VMware vSphere 服务器虚拟化之二十二桌面虚拟化之创建View Composer链接克隆的虚拟桌面池
VMware vSphere 服务器虚拟化之二十二桌面虚拟化之创建View Composer链接克隆的虚拟桌面池 在上一节我们创建了完整克隆的自动专有桌面池,在创建过程比较缓慢,这次我们将学习创建Vi ...
- 备忘录模式 Memento 快照模式 标记Token模式 行为型 设计模式(二十二)
备忘录模式 Memento 沿着脚印,走过你来时的路,回到原点. 苦海翻起爱恨 在世间难逃避命运 相亲竟不可接近 或我应该相信是缘份 一首<一生所爱>触动了多少 ...
- JAVA基础知识总结:一到二十二全部总结
>一: 一.软件开发的常识 1.什么是软件? 一系列按照特定顺序组织起来的计算机数据或者指令 常见的软件: 系统软件:Windows\Mac OS \Linux 应用软件:QQ,一系列的播放器( ...
- (C/C++学习笔记) 二十二. 标准模板库
二十二. 标准模板库 ● STL基本介绍 标准模板库(STL, standard template library): C++提供的大量的函数模板(通用算法)和类模板. ※ 为什么我们一般不需要自己写 ...
- 剑指Offer(二十二):从上往下打印二叉树
剑指Offer(二十二):从上往下打印二叉树 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/b ...
- Bootstrap <基础二十二>超大屏幕(Jumbotron)
Bootstrap 支持的另一个特性,超大屏幕(Jumbotron).顾名思义该组件可以增加标题的大小,并为登陆页面内容添加更多的外边距(margin).使用超大屏幕(Jumbotron)的步骤如下: ...
- 二十二、OGNL的一些其他操作
二十二.OGNL的一些其他操作 投影 ?判断满足条件 动作类代码: ^ $ public class Demo2Action extends ActionSupport { public ...
随机推荐
- C语言之函数调用06—彩球排列
//函数调用+递归法 /* ========================================================== 题目:将4个红球,3个白球.3个黄球排成一排,共同拥有 ...
- dpkg 小记
dpkg 安装 dpkg -i to-be-install.deb dpkg 删除 dpkg -r name-of-app dpkg -l 查看有哪些包被安装.其中 ii 标记的包是正常的, rc 标 ...
- python 排序 sorted 如果第一个条件 相同 则按第二个条件排序
怎样遍历一个list 符合下列条件 1. 按照元组的第一个从小到大排序 2. 如果第一个相同 则按照元组第2个从大到小 排序 a = [[2,3],[4,1],(2,8),(2,1),(3,4)] b ...
- python在linux的报错集锦
1. 报错提示 /usr/lib/python2.7/site-packages/requests/__init__.py:80: RequestsDependencyWarning: urllib3 ...
- PhpStorm 2017.1安装及破解过程
1.下载原安装文件和破解文件:magnet:?xt=urn:btih:7FD357910B7AFBFC8FBA3647A2FAC8F15F0D02F0 (直接放到迅雷里下载) 2.Licence S ...
- RHEL7-openldap安装配置一(服务器端安装配置)
LDAP的术语:entry:一个单独的单元,使用DN(distinguish name)区别attribute:entry的属性,比如,如果entry是组织机构的话,那么它的属性包括地址,电话,传真号 ...
- C++基础学习教程(六)----类编写的前情回想以及项目实战(1)
在開始类的编写之前我们依旧须要回想整理一下前面所说的内容,(前面尽管是一个自己定义数据类型的实现过程,可是内容有点繁杂). 先看一段代码: /** @file calssStruct.cpp */ / ...
- Easyui入门视频教程 第01集---认识Easyui
认识EasyUI 目录 ----------------------- Easyui入门视频教程 第09集---登录完善 图标自定义 Easyui入门视频教程 第08集---登录实现 ajax b ...
- Redability
在写爬虫进行舆情分析.情感分析等内容时,我们经常爬取博客.新闻等长篇大论的文章,在一个网页上,根据网页布局,人眼可以很明确的确定哪些元素是文章主体.人眼既然能够识别,那么机器必然也是能够识别的.如果给 ...
- 使用 numpy.random.choice随机采样
使用 numpy.random.choice随机采样: 说明: numpy.random.choice(a, size=None, replace=True, p=None) 示例: >> ...