php类中static与self的使用区别浅析

使用 self:: 或者 __CLASS__ 对当前类的静态引用,取决于定义当前方法所在的类:

使用 static:: 不再被解析为定义当前方法所在的类,而是在实际运行时计算的。也可以称之为“静态绑定”,因为它可以用于(但不限于)静态方法的调用。

静态绑定是PHP 5.3.0,增加的一个功能 用于在继承范围内引用静态调用的类

php类中static和self的区别,php类的定义中经常能看到self和static,在运行的时候经常发现结果并没有区别,但是肯定不是没有区别,因为没有区别为什么会有两个呢?

一、两者区别

static采用的是延时绑定

所以会导致static能准确知道是父类还是子类的调用

举个例子,这就说明static是个聪明的小朋友,他家里的亲戚他都能准确的认识

而self是个有点笨笨的小朋友,他只认识你自己的父母

二、代码看不同

由下面代码可以看出

self指向的是定义他的类,也就是他只认识自己的父母

static指向的是调用他的类,也就是他可以认出自己的亲戚

<?php
class parents
{
    protected static $name = '我是你父母';

    public static function who_self()
    {
        return self::$name;
    }

    public static function who_static()
    {
        return static::$name;
    }

    public static function get_self()
    {
        return new self();
    }

    public static function get_static()
    {
        return new static();
    }
}

class kinsfolk extends parents
{
    protected static $name = '我是你亲戚';
}

var_dump(kinsfolk::who_self()); //我是你父母
var_dump(kinsfolk::who_static()); //我是你亲戚
var_dump(kinsfolk::get_self()); //object(parents)#1 (0) {}
var_dump(kinsfolk::get_static()); //object(kinsfolk)#1 (0) {}

简单通俗的来说,

self就是写在哪个类里面, 实际调用的就是这个类.

static代表使用的这个类, 就是你在父类里写的static,然后被子类覆盖,使用的就是子类的方法或属性

总结

到此这篇关于php类中static与self区别的文章就介绍到这了,更多相关php类static与self区别内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • PHP中new static()与new self()的区别异同分析

    本文实例讲述了PHP中new static()与new self()的区别异同,相信对于大家学习PHP程序设计能够带来一定的帮助. 问题的起因是本地搭建一个站.发现用PHP 5.2 搭建不起来,站PHP代码里面有很多5.3以上的部分,要求更改在5.2下能运行. 改着改着发现了一个地方 return new static($val); 这尼玛是神马,只见过 return new self($val); 于是上网查了下,他们两个的区别. self - 就是这个类,是代码段里面的这个类. static

  • PHP new static 和 new self详解

    最近在一个视频的评论被问到一个小问题:这里选择用static 而不是self有特殊的考虑么?或者我们可以这样转换一下问题: PHP 的 new static 和 new self 具体有什么? 其实这个来看一个例子应该就很清晰了: class Father { public static function getSelf() { return new self(); } public static function getStatic() { return new static(); } } c

  • php类中的$this,static,final,const,self这几个关键字使用方法

    本篇文章主要分项了一下关于php类中的$this,static,final,const,self这几个关键字使用方法. $this $this表示当前实例,在类的内部方法访问未声明为const及static的属性时,使用$this->value='phpernote';的形式.常见用法如: $this->属性 $this->方法 举例如下: <?php class MyClass{ private $name; public function __construct($name){

  • PHP面向对象中new self()与 new static()的区别浅析

    前言 本文主要跟大家介绍了关于PHP面向对象中new self()与 new static()的区别,这两个方法new出来的对象有什么区别呢,说白了就是new出来的到底是同一个类实例还是不同的类实例呢?下面话不多说了,来一起看看详细的介绍吧. 区别如下: 首先阐明结论,在PHP中 self指向定义了当前被调用方法的类, static指向调用当前静态方法的类. 接下来通过一个例子来证明上面的结果 class A { public static $_a = 'Class A'; public sta

  • 浅谈PHP中new self()和new static()的区别

    本文介绍了PHP中new self()和new static()的区别,分享给大家,也给自己留个笔记. 1.new static()是在PHP5.3版本中引入的新特性. 2.无论是new static()还是new self(),都是new了一个新的对象. 3.这两个方法new出来的对象有什么区别呢,说白了就是new出来的到底是同一个类实例还是不同的类实例呢? 为了探究上面的问题,我们先上一段简单的代码: class Father { public function getNewFather(

  • PHP中static关键字以及与self关键字的区别

    概述 正在学习设计模式,之前有一篇文章关于单例模式的文章,重新读了这篇文章,发现对static关键字掌握不是很牢靠,重新温习一下. static关键字 PHP手册里对static关键字的介绍如下: 复制代码 代码如下: Declaring class properties or methods as static makes them accessible without needing an instantiation of the class. A property declared as

  • php self,$this,const,static,-&gt;的使用

    今天来总结下. .在类的内部方法访问已经声明为const及static的属性时,使用self::$name的形式.注意的是const属性的申明格式,const PI=3.14,而不是const $PI=3.14 复制代码 代码如下: class clss_a { private static $name="static class_a"; const PI=3.14; public $value; public static function getName() { return se

  • PHP中new static() 和 new self() 的区别介绍

    长夜漫漫啊! 今天领导本地搭建一个站.发现用PHP 5.2 搭建不起来,站PHP代码里面有很多5.3以上的部分,领导让苦逼我更改在5.2下能运行. 改着改着发现了一个地方 复制代码 代码如下: return new static($val); 这尼玛是神马,只见过 复制代码 代码如下: return new self($val); 于是上网查了下,他们两个的区别. self – 就是这个类,是代码段里面的这个类. static – PHP 5.3加进来的只得是当前这个类,有点像$this的意思,

  • php类中static与self的使用区别浅析

    使用 self:: 或者 __CLASS__ 对当前类的静态引用,取决于定义当前方法所在的类: 使用 static:: 不再被解析为定义当前方法所在的类,而是在实际运行时计算的.也可以称之为"静态绑定",因为它可以用于(但不限于)静态方法的调用. 静态绑定是PHP 5.3.0,增加的一个功能 用于在继承范围内引用静态调用的类 php类中static和self的区别,php类的定义中经常能看到self和static,在运行的时候经常发现结果并没有区别,但是肯定不是没有区别,因为没有区别为

  • C#类中static变量用法分析

    本文实例讲述了C#类中static变量用法.分享给大家供大家参考.具体分析如下: 先来看一段代码: 复制代码 代码如下: using System; namespace Param { class Class1 { static int i = getNum(); int j = getNum(); static int num = 1; static int getNum() { return num; } [STAThread] static void Main(string[] args)

  • 浅谈java中math类中三种取整函数的区别

    math类中三大取整函数 1.ceil 2.floor 3.round 其实三种取整函数挺简单的.只要记住三个函数名翻译过来的汉语便能轻松理解三大函数,下面一一介绍 1.ceil,意思是天花板,java中叫做向上取整,大于等于该数字的最接近的整数 例: math.ceil(13.2)=14 math.ceil(-13.2)=-13 2.floor,意思是地板,java中叫做向下取整,小于等于该数字的最接近的整数 例: math.floor(13.2)=13 math.floor(-13.2)=-

  • JavaScript中const、var和let区别浅析

    在JavaScript中有三种声明变量的方式:var.let.const.下文给大家介绍js中三种定义变量的方式const, var, let的区别. 1.const定义的变量不可以修改,而且必须初始化. const b = 2;//正确 // const b;//错误,必须初始化 console.log('函数外const定义b:' + b);//有输出值 // b = 5; // console.log('函数外修改const定义b:' + b);//无法输出 2.var定义的变量可以修改,

  • JavaScript中var、let、const区别浅析

    下面通过代码给大家介绍JavaScript中var.let.const区别,具体代码如下所述: //1.var定义的变量可以修改,如果不初始化会输出undefined,不会报错. var a; console.log(a); //undefined //2.let是块级作用域,函数内部使用let定义后,对函数外部无影响. let c = 3; console.log(c) function change(){ let c = 6; console.log(c) } change(); (1)只要

  • 理解PHP5中static和const关键字的区别

    PHP5中加入了很多面向对象的思想,PHP5的面向对象比较接近Java的面向对象思想.我们这里对PHP5中的static和const关键字作用进行一下描述,希望对学习PHP5的朋友有帮助. (1) static static关键字在类中是,描述一个成员是静态的,static能够限制外部的访问,因为static后的成员是属于类的,是不属于任何对象实例,其他类是无法访问的,只对类的实例共享,能一定程序对该成员尽心保护.类的静态变量,非常类似全局变量,能够被所有类的实例共享,类的静态方法也是一样的,类

  • .NET MVC中ViewData,ViewBag和TempData的区别浅析

    本文分析了.NET MVC中ViewData,ViewBag和TempData的区别.分享给大家供大家参考.具体分析如下: ViewData和TempData是字典类型,赋值方式用字典方式,如: 复制代码 代码如下: ViewData["myName"] ViewBag是动态类型,使用时直接添加属性赋值即可,如: 复制代码 代码如下: ViewBag.myName ViewBag和ViewData只在当前Action中有效,等同于View TempData可以通过转向继续使用,因为它的

  • MySQL去重中distinct和group by的区别浅析

    今天在写业务需要对数据库重复字段进行去重时,因为是去重,首先想到的是distinct关键字.于是一小时过去了....(菜鸟一个,大家轻点骂) 我把问题的过程用sql语句演示给大家演示一下 首先我使用的是mybatis-plus,代码如下 QueryWrapper<ProjectCompany> wrapper = new QueryWrapper<>(); wrapper.select("DISTINCT project_id,company_id,company_nam

  • PHP类中Static方法效率测试代码

    类的定义如下: 复制代码 代码如下: class test { public static function a(){} public function b(){} } $obj = new test; 比较以下几种情况 test::a(); $obj->a(); $obj->b(); 测试代码: 复制代码 代码如下: $obj = new test; $test_times = 100; $times = 10000; $effi1 = array(); $effi2 = array();

  • 往DAO类中注入@PersistenceContext和@Resource的区别详解

    目录 DAO类注入@PersistenceContext和@Resource区别 @PersistenceContext @Resource JPA中为什么EntityManager的注解要用@PersistenceContext 根据上面的描述,总结如下 DAO类注入@PersistenceContext和@Resource区别 @PersistenceContext private EntityManager em; 注入的是实体管理器,执行持久化操作的,需要配置文件persistence.

随机推荐