首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

PHP 静态属性和静态方法

1、基本使用 前面介绍的 PHP 类属性和方法都要在实例化后才能调用(常量属性除外),除此之外,PHP 还提供了静态属性和静态方法,所谓「静态」指的是无需对进行实例化,就可以直接调用这些属性和方法,...PHP_EOL; 如果是内部方法中,需要通过 self:: 引用当前静态属性和方法,就像常量一样,因为静态属性和方法无需实例化即可使用没有实例化的情况下,$this 指针指向的是空对象,...这是因为,和 $this 指针始终指向持有它的引用对象不同,self 指向的是定义持有它的不是调用时的,为了解决这个问题,从 PHP 5.3 开始,新增了一个叫做后期静态绑定的特性。...后期静态绑定 后期静态绑定(Late Static Bindings)针对的是静态方法调用使用该特性不再通过 self:: 引用静态方法,而是通过 static::,如果是定义它的调用,则指向当前...Car::who(); LynkCo01::who(); 再次执行,打印结果如下: Car LynkCo01 表明后期静态绑定生效,即 static 指向的是调用它的方法所在的不是定义,所以称之为后期静态绑定

4.2K10

后期静态绑定在PHP中的使用

我们使用self关键字,当使用B调用test()静态方法self指向的是A的who()方法,因此,输出的是A。...别激动,这是普通的静态绑定。self关键字调用的内容取决于它定义所在的。也就是说不管怎么继承,用哪个子类来调用test()方法self关键字都会调用的是A的who()方法。 而后期静态绑定呢?...其实就有点像实例化的对象,每个实例化的对象,调用的都是自身,不是的属性方法。...普通的静态调用不是这样,但是现实中我们又有这样的需求,就像实例化对象的调用方式一样来调用静态属性方法,这时,我们就可以使用static关键字来实现后期静态绑定。...静态方法中可以根据调用方式判断当前是哪个来进行其他的业务逻辑操作。另一个是forward_static_call()方法,用于静态方法调用

69310
您找到你想要的搜索结果了吗?
是的
没有找到

PHP基本概念

抽象不能实例化,普通可以继承抽象。 建议仅在部分 "内核" 代码中使用接口,从语义上考虑,可以更多的使用抽象静态变量 静态变量属于不属于的某个实例。...::是作用域限定操作符,这里用的是self作用域,不是$this作用域,$this作用域只表示的当前实例,self::表示的是本身。...与parent和self不同的是,parent 引用的是父作用域,self引用的是当前的作用域,static引用的是全部静态作用域,子类会覆盖父 栈和堆 一般认为c中分为这几个存储区:...访问PHP中的成员变量或方法,如果被引用的变量或者方法被声明成const(定义常量)或者static(声明静态),那么就必须使用操作符::,反之如果被引用的变量或者方法没有被声明成const或者static...另外,如果从内部访问const或者static变量或者方法,那么就必须使用自引用的self,反之如果从内部访问不为const或者static变量或者方法,那么就必须使用自引用的$this。

1K20

PHP后期静态绑定实例浅析

分享给大家供大家参考,具体如下: 从php5.3开始,php增加了一个叫后期绑定的功能,用于继承范围内引用静态调用 该功能从语言内部角度考虑北命名为“后期静态绑定”;“后期绑定”意思说:static...::不再被解析为定义当前方法所在的,而是实际运行时计算的,也可以成为“静态绑定”;因为他可以用于(但不限于静态方法调用)。...self::的限制 使用self::或者_class_对当前静态引用,取决于定义当前方法所在的 例子: class A { public static function who() {...简单的说,这个关键字能够让你在上述中调用test()引用的是B不是A。最终决定不引用新的关键字,而是使用已经预留static关键字 例子: <?...打印结果是: B 后期静态绑定的处理方式解决了以往完全没有解决的静态调用,另外一方面,如果静态调用使用parent::或者self::将转发调用信息 <?

69231

PHP延迟静态绑定的深入讲解

前言 所谓延迟静态绑定,顾名思义,静态调用时::符号左侧的部分的的绑定是延迟,也就是说不再被解析为定义当前方法所在的,而是实际运行时计算的。...> 有没有嗅到坏代码的味道?可以看到,MySQLHandler和MemcachedHandler中,都有一个create函数,除掉我的输出语句,发现它们一模一样,这就是代码冗余。...这也是 self 和 的限制。使用 self:: 或者 对当前静态引用,取决于定义当前方法所在的。所以,这就很好的解释了为什么上面的代码输出了A。但是,如果我们需要输出B呢?...> 后期静态绑定本想通过引入一个新的关键字表示运行时最初调用来绕过限制。简单地说,这个关键字能够让你在上述例子中调用 test() 引用的是 B 不是 A。...对于文章一开始的例子,可以这么改: return new static(); // 改变这里,后期静态绑定 这种使用后期静态绑定,使用PHP实现23中设计模式的时候,你会感到很轻松的。

59820

PHP中的static

,但现在似乎是不需要了,使用内部静态变量就可以解决了。...使用引用对象,我们赋值的是内存引用地址。但是同样的原因,静态属性是运行时产生的,引用地址不是静态地存储,于是,赋不上值了呗,永远会是NULL。不信你接着用getRefObj()再生成几个试试。...原因呢,就是self是取决于当前定义方法所在的。这就是静态属性方法的另一大特点,不实例化,跟随着不是实例。 class A{...}...依然是走的静态过程不是这个对象中真的包含了showV()这个方法,因此,$this当然取不到啦! 那么,如何让父A中test()方法调用到子类的who()方法呢?..."\n"; } } BB::test(); // BB 没错,使用static::关键字这种形式调用static表示运行最初时的不是方法定义。这样就完成了后期静态绑定。

99030

PHP关键字SelfStatic和parent的区别

简介 使用PHP代码,您可能经常会遇到parent::、static::和self::。但是当你第一次作为一个开发人员开始的时候,有时候你会很困惑,不知道它们是做什么的,以及它们之间的区别。...因此,我们需要告诉PHPBaseTestCase中使用setUp方法不是使用this->setUp()。...对User上的makeConnection方法调用使用了User上的connection属性,不是Model(该方法实际所属的)。这是由于PHP中一个名为“后期静态绑定”的特性。...“后期绑定”来自这样一个事实,即static::将不会使用定义方法来解析,而是使用运行时信息来计算。它也被称为“静态绑定”,因为它可以用于(但不限于)静态方法调用。"...一般来说,我通常会使用static::不是self::,因为我希望我的是可扩展的 例如,假设我想写一个,我完全打算由子类继承(例如上面示例中的BaseTestCase)。

9810

PHP的魔术方法--上

前言 魔术方法是反序列化的基础,而且CTF中,序列化题目,你说我有什么理由不学习反序列化呢!!! !...学习反序列化的前提就是要对常见的魔术方法有一个了解,魔术方法目前包括16个: ```php __construct():构造函数 __destruct():析构函数 __call():当调用了一个不存在的方法调用...__callStatic():当使用静态方式调用不可用方法调用 __get():当访问了 __set(): __isset(): __unset(): __sleep(): __wakeup...$value_b); echo '也不存在\n'; } } $fun = new Fun('现在我传给了$vula'); $fun->asd(1,2); ``` #__callStatic() 但是用静态方法调用一个不存在的函数...名::函数名 则代表着用静态方法调用中的__callStatic()要用static修饰,否则会报错警告(*BI WARGING) #__get 当外部调用中一个不存在的变量,将会被调用,其中包含一个参数

1.5K20

PHP的变量范围

PHP中变量的作用域可以分为:超全局(全局变量的特殊类型,局部范围里可直接使用),全局,局部,静态(是局部变量的特殊类型) PHP中,全局变量实际上是静态全局变量,如果不用unset显式的释放,那么等脚本运行结束全局变量才会被释放掉...局部静态变量细分可以是 局部静态函数变量(函数中声明的static变量),局部静态成员变量(中声明的 static 属性,被所有实例共享) 局部静态变量只有脚本运行结束才会被自动释放 超全局变量...,function,if等语言内部使用,需要用关键词global或者超全局变量$GLOBALS 静态变量: function中使用关键词static声明的变量,静态变量的值保留直至脚本结束 局部变量:...第二次2 static 关键词还可以声明静态属性和静态方法 静态属性只能被调用不能被实例调用 静态方法里不能使用$this,只能用self访问静态属性 另外理解static变量的一段代码...,即使是不同的实例,他们也会共享这个静态变量,尽管这个静态变量不是静态成员变量,这点容易让人迷惑

1.9K20

PHP设计模式之单例模式

比如数据库操作、网络请求、日志操作、配置管理服务等等 曾经有过面试官问过,单例PHP中到底是不是唯一的?如果在一个进程下,也就是一个fpm下,当然是唯一的。...我们可以Illuminate\Container\Container中找到singleton方法。它调用了bind方法中的getClosure方法。...继续追踪会发现他们最终会调用Container的make或build方法来进行实例化,不管是make还是build方法,他们都会有单例的判断,也就是判断是否被实例化过或者容器中已存在。...懒汉式多线程的应用中,如java多线程或者PHP使用swoole之后,会出现重复创建的问题,而且这多次创建的都不是同一个对象了。这时一般会使用双重检测来来确保全局还是只有唯一的一个对象。...还有一种方式是静态内部类的创建方式。这种平常就不多见了,它的资源利用率高。将静态变量放在方法内,使静态变量成为方法内的变量不是中的变量。它可以让单例对象调用自身的静态方法和属性。

1.2K10

phpselfstatic的区别

对于self的解释 关键字“self”的工作原理是:它会调用当前(current class)的方法。因为model方法class Car中定义的,所以对它来说当前就是class Car。...可以使用关键字staticstatic关键字和延迟静态绑定(late static binding) PHP5.3中,加入了一个新的特性,叫做延迟静态绑定。它可以帮我们实现多态,解决上面的问题。...简单来说,延迟静态绑定意味着,当我们用static关键字调用一个继承方法,它将在运行时绑定调用(calling class)。...在上面的例子中,如果我们使用延迟静态绑定(static),意味当我们调用“Mercedes::model();”,class Mercedes中的getModel方法将会被调用。...php中的selfstatic 现在我们将例子中的selfstatic替换,可以看到,两者的区别在于:self引用的是当前(current class)static允许函数调用在运行时绑定调用

54420

PHP 面向对象

$this self parent static 当一个方法定义内部调用时,有一个可用的伪变量 $this。 使用 self:: 来访问静态方法静态变量。...使用 static:: 来访问静态方法静态变量。 使用 parent:: 来访问父方法静态属性。 定义内部,可以用 new self 和 new parent 创建新对象。...属性、方法常量 属性 中的变量可以初始化,但是初始化的值必须是常数,这里的常数是指 PHP 脚本在编译阶段就可以得到其值,不依赖于运行时的信息才能求值。...__set_state() 当调用 var_export() 导出,此静态方法会被调用。...子类可以覆盖父的属性或方法,当覆盖方法,参数必须保持一致否则 PHP 将发出 E_STRICT 级别的错误信息。但构造函数例外,构造函数可在被覆盖使用不同的参数。

1.5K70

PHP程序员:你过来,给我说说 $this,selfstatic 有什么区别?

换句话说: $this->member 调用静态属性/方法self::number 调用静态属性/方法。 举个栗子,比较直观,说概念总是那么枯燥。 ?...上面这个例子很明确地使用静态属性,和动态属性,构造函数内调用。实例化时执行。 如果反过来用就出错了,比如使用self::$non_static_member . ' ' ....$this->static_member; self 调用了非静态属性, $this 调用静态属性,这是错误的用法。...继承的 X 的 foo() 方法被重写,并不执行。 现在换一种写法。 ? 这次 X 的 bar 方法我们使用 self::foo() 调用。...引申:尽量别用 self::,要用 static:: self 简单好用,但是作用域叫人恼火。因为它的作用域是定义的,不是执行时的。比如这么个例子: ?

1K20

怎样用 PHP 来实现枚举?

业务场景 实际开发过程中我们非常容易接触到枚举类型,但是又因为 PHP 原生对枚举的支持不是太好,所以很多时候 开发人员并没有重视枚举的使用,而是使用全局常量或者常量代替,而这两个数据原则上还是 字符串...这里我们就需要用到 PHP 面向对象中的一个魔术方法 __toString() public __toString ( void ) : string __toString() 方法用于一个被当成字符串应怎样回应...看看,第 :three: 个那里,就已经成了意外了,哪还有没有办法补救?答案当然是有的 ,在这里我们会用到 PHP 另一个好东西 反射 ,当然这个不是 PHP 特有的,其他语言也有。...// 这里就是取出来调用静态方法名对应的常量值 虽然这里有个 getValue 方法 // 但是因为其返回值不可靠 我们就依赖于他原本的隐式的 __toString 方法来帮我们输出字符串即可...// 这里就是取出来调用静态方法名对应的常量值 虽然这里有个 getValue 方法 // 但是因为其返回值不可靠 我们就依赖于他原本的隐式的 __toString 方法来帮我们输出字符串即可

2.6K20

php学习之类与对象的静态方法

基本介绍 当程序员需要对静态属性进行操作,就需要定义静态方法处理,静态方法是专门操作静态属性的 基本语法 class 名{ 访问修饰符 static function 函数名 (){ //函数体 }...} 说明: 静态方法中定义的 static是关键词 静态方法是专门用于操作静态属性 静态方法可以直接用调用,形式是:名::静态方法名(参数) 小案例: <?...静态方法注意事项 的外部调用静态方法名::静态方法名,或者对象名->静态方法名或者对象名::静态方法名,后面两种不推荐使用 内部调用静态方法self::静态方法名  或者名::静态方法名...的年龄是 '. self::$age;//这样写也是错误的 不能访问非静态属性 } //内部调用静态方法 public function show(){ //方法一:self::方法self:...Person::getAge(); //的外部通过对象调用静态方法 $person = new Person('张三'); $person->getAge(); //的外部通过对象名::静态方法调用

59500

PHP精华

"/n"; self::myMethod(); //扩展使用self作用域,self可以调用中声明的方法,但它调用的总是已经扩展中重写的方法....ReflectionMethod 的实例*/ reflectionMethod->isStatic()) { //调用静态方法,注意参数是null 不是一个反射实例 pluginInstance =...php中定义的作用域有self和parent两种(php6中提供了static作用域)。...也就是说,当在扩展使用self,它调用不是方法,而是扩展的重载的方法self是指向本身,也就是self是不指向任何已经实例化的对象,一般self使用来指向中的静态变量。...属性中的变量可以初始化,但是初始化的值必须是常数,这里的常数是指php脚本在编译阶段就为常数,不是在编译阶段之后在运行阶段运算出的常数。

1.1K40

PHP面向对象基础总结

2.属性中的变量可以初始化,但是初始化的值必须是常数,这里的常数是指php脚本在编译阶段就为常数,不是 在编译阶段之后在运行阶段运算出的常数。...3.的成员方法里面,可以通过$this->property(property是属性名字)这种方式来访问的属性、 方法,但是 要访问静态属性或者静态方法里面却不能使用,而是使用self::$property...4.的非静态方法里面可以使用伪变量$this,这个伪变量是调用方法的实例化对象引用 5.常量的值必须是一个定值,不允许修改,且不能是变量,类属性或其它操作(如函数调用)的结果。 <?...self 和 parent这两个特殊的关键字是用于内部对成员或方法进行访问的。 10.当一个子类覆盖其父中的方法PHP 不会再执行父中已被覆盖的方法,直到子类中调用这些方法为止。...11.静态变量和方法 声明成员或方法static,就可以不实例化直接访问。不能通过一个对象来访问其中的静态成员(静态方法 除外)。

1.5K30

PHP与对象后期静态绑定操作实例详解

PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能,用于继承范围内引用静态调用。...可用 get_called_class() 函数来得到被调用方法所在的名,static:: 则指出了其范围。 该功能从语言内部角度考虑被命名为“后期静态绑定”。...“后期绑定”的意思是说,static:: 不再被解析为定义当前方法所在的,而是实际运行时计算的。也可以称之为“静态绑定”,因为它可以用于(但不限于)静态方法调用。 <?...以上例程会输出: B Note: 静态环境下,所调用即为该对象实例所属的。由于 $this- 会在同一作用范围内尝试调用私有方法 static:: 则可能给出不同结果。...另一方面,如果静态调用使用 parent:: 或者 self:: 将转发调用信息。 Example #4 转发和非转发调用 <?

41051

PHP中常用的设计模式

新的实例是用过静态方法 getInstance() 使用后期静态绑定生成的。这允许我们对 Singleton 进行继承,并且取得 SingletonChild 的单例不会出现问题。...你应该非常小心地使用单例模式,因为它非常自然地引入了全局状态到你的应用中,降低了可测试性。 大多数情况下,依赖注入可以(并且应该)代替单例。...使用依赖注入意味着我们不会在设计应用时引入不必要的耦合,因为对象使用共享的或全局的资源,不再需要耦合具体的。<?php/** * 我们如何来写一个属于自己的单例呢?...* 1.有一个静态成员变量来保存的唯一实例 * 2.构造函数和克隆函数必须申明为私有的(防止外部程序能通过 new 关键字进行创建对象) * 3.公共的静态方法可以访问的实例作为一个引用返回...工厂方法或者生成对象,不是代码中直接 new,好处在于改动一个的名称或者参数,只需要改动一个地方// Factory.php<?

2000
领券