IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> php中,new实例化调用方法和self::调用方法调用的区别 -> 正文阅读

[PHP知识库]php中,new实例化调用方法和self::调用方法调用的区别

静态方法

静态方法:在内存中只有一份,也就是你声明的那个静态方法,会存储在内存中,因此他不能用$this,因为他只是一个方法存在内存中,不是对象。如果你想要在静态方法中调用外部的东西,那么你也要让目标声明为静态或者const;让它也跟着一起存储进内存中,注意哦,这里的存储都不是整个类,而是自己本身。他们都需要用self去调用,可以这么说,self就是调用不是类对象的一种方式,是调用存储在内存的方法、变量、const,他们都是声明为静态的。

触发存储内存的时机

静态方法存储内存的时机是:Aoo::aa() ; 这时候,会把aa()这个方法存储在内存中

注意:只是单单这个方法存储内存哦,如果方法里面有静态调用的话,对应的目标也会跟着存内存,触发存储内存的时机也是一样的

如下:

class Aoo {

????static $a = 1;
????const A = 2;

? ? public static function aa() {
? ? ?    $b =?self::$a;
         $c = self::A;
????}

}

static $a 和 const A 也会被触发存储在内存中

实例化

实例化:在内存中存储的是整个对象,里面包括静态方法和非静态方法

触发存储内存的时机

实例化再调用方法的时机

$aoo = new Aoo();//这里触发存储内存时机

$app->abc();

在new Aoo()的时候,会把这个Aoo类存储到内存,这一份内存中记录的是Aoo里面的所有东西,变量、方法、静态方法、const、.............

代码展示

class Aoo {
    public function abc(){}
    public static function aa() {}
}

// 静态方法在内存中只有一份,不是对象,所以只能静态调用,不像实例化那种,直接把对象存内存了,这个静态方法是只有静态方法存储在内存中,而且静态方法里面是不能$this的,因为他不是对象,他只是一个方法,
// 想要调用静态方法外面的变量,那么他们也必须声明为静态或const,需要让对方存储在内存中
Aoo::aa();
$aoo = new Aoo();// new 的时候,其实是在new Aoo()的时候会把这个类的所有东西弄成对象的形式,存储在内存中,包括静态方法,因此可以$this->,也可以self
$aoo->abc(); 
$aoo->aa();

总结

可以看出

1、new 类的时候,内存占用会更大,因为是整个类的东西,包括了静态方法、变量等等,它的占用空间就大了。要做的东西就多了

2、self:: 静态调用的时候,只是单单把目标存储在内存中,它的占用空间就少了。要做的东西就少了。

3、如果你在循环中,建议是这样写

$aoo = new Aoo();

for($i=0;$i>10;$i++) {

????????$aoo->abc();

}

不建议这样写



for($i=0;$i>10;$i++) {

????????Aoo::aa();

}

因为函数调用完之后会释放

这时候静态调用就会一直在 存储内存,释放内存之间切换。io调用很频繁,虽然它的内存占用会比实例化的要小

如果是实例化出来再调用方法的话,就是一直存储在内存中,等该脚本或调用方结束了才会释放这个实例化出来的对象

具体看你怎么想吧,我个人觉得是实例化出来再循环调用会比较节省io调用,速度就会快。

下面开始证明上面的总结

第一个例子:

函数销毁的例子?

class a {
  function __destruct(){
    echo "destructor<br>";
  }
}

function b(){ // test function
  $c=new a();
  echo 'exit from function b()<br>';
}

echo "before b()<br>";
b();
echo "after b()<br>";

die();

此脚本输出:

before b()
exit from function b()
destructor
after b()

因此现在很明显,变量$c在函数b()结束后被销毁了.

下面来看第二个例子

被调用方

class ConfigService
{
    public function __destruct()
    {
        dd(44444);
    }

    public function aaa()
    {
        return 123123123;
    }
}

调用方


$aoo = new ConfigService();

for ($i = 0; $i > 10; $i++) {
   $aoo->aaa();
}
var_dump(333);exit;

输出

333先于44444输出,也就是说,循环结束了才销毁对象

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-12-11 15:31:14  更:2021-12-11 15:31:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/13 14:31:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码