当前位置:首页 > CN2资讯 > 正文内容

php分享二十二:php面向对象php 空对象

1天前CN2资讯

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

    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/32446.html

    分享给朋友:

    “php分享二十二:php面向对象php 空对象” 的相关文章

    RackNerd VPS:超高性价比与稳定服务的完美选择

    引言 在如今的网络环境中,选择一家合适的VPS服务商无疑是一个关键决策。很多人可能对market上的多个选项感到无从选择。RackNerd作为一家美国成立的VPS主机商,凭借其超高性价比迅速进入了大众视野。特别是在一年一度的黑五促销活动中,RackNerd常常引发热潮,其 $10/年的价格实在让人不...

    全面提升VPS性能测试与优化方法指南

    VPS性能测试概述 在使用VPS的过程中,了解它的性能测试显得尤为重要。VPS性能测试是一种评估虚拟专用服务器性能的手段,可以帮助我们清晰地了解VPS的状态与能力。这项测试不仅关注CPU型号、内存大小等硬件配置,还涵盖了磁盘存储量、操作系统版本以及虚拟化程序等多个方面的检测。通过这些参数,我们能对V...

    搭建VPN梯子的最佳VPS推荐,轻松畅游网络

    在探索Internet的过程中,VPN梯子的搭建显得尤为重要。VPN梯子,简单来说,是通过虚拟专用网络(VPN)创建的一个安全通道,它能够帮助用户绕过地理限制,访问被封锁的网站和服务。随着互联网信息安全和隐私保护需求的增加,搭建VPN梯子成为越来越多用户的选择。 想象一下,当我们在国外旅行时,无法访...

    提升科研效率:1536微量高速离心机及其应用

    产品概述与特点 在实验室的工作中,设备的效率通常会直接影响到实验的结果。1536微量高速离心机就是这样一款能够大大提高离心效率的设备。它能够处理1.5ml和2.0ml的离心管、8连管、PCR管以及5ml管,极大地方便了科学研究中的样品处理流程。产品的设计充分考虑了用户的使用需求,具备了最高15,00...

    Virmach虚拟主机评测:高性价比VPS服务推荐

    大家好,今天我想和你聊一聊Virmach,这是一家我非常推荐的虚拟主机提供商。Virmach专注于提供VPS(虚拟专用服务器)服务,近年来逐渐在行业中赢得了一席之地。它的价格相对亲民,而服务质量与稳定性也让人感到满意。很多人选择它,主要是因为它不仅适合个人用户,也非常受中小企业欢迎。 Virmach...

    DigitalOcean与Vultr的全面比较与选择建议

    DigitalOcean与Vultr概述 1.1 DigitalOcean简介 DigitalOcean成立于2012年,总部位于美国纽约,这家公司一开始就定位于为开发者提供高效的云计算服务。最初的目标是简化云计算,让更多人能够轻松使用这一新兴技术。随着时间的推移,DigitalOcean不断扩展其...