php"直接用类名"和"new实例化"调用函数哪种方法效率更高?

发布网友 发布时间:2022-04-06 07:45

我来回答

3个回答

懂视网 时间:2022-04-06 12:07

静态方法只有一个,无论你调用多少次,都是共用的,是没有对象的概念,因此不能在静态方法里面使用$this调用,如果非得调用的话,只能实例化自身类

实例化不一样,每一个实例化是一个对象,拥有多个。

下面用一个实例来了解一下

<?php
Error_reporting(E_ALL|E_STRICT);
 
class A{
 
 public function bar(){
 echo 'bar'.PHP_EOL;
 }
 public static function foo(){
 echo 'foo'.PHP_EOL;
 }
}
 
A::bar();//会报错
A::foo();//正确
$obj = new A();
$obj -> foo();//正确
/* 
  bar()是一个非静态方法,应该由对象来调用,但用静态来调用此方法也可以执行,而严格状态下,此方法会执行,同时报错, 
  Strict Standards: Non-static method Human::easyeat() should not be called statically in........
  但是实例化的类是可以调用静态方法的。
*/
<?php
 
class A{
 public $name = 'kangbazi';
 
 public function bar(){
 echo 'bar'.PHP_EOL;
 }
 public static function foo(){
 echo self::$name.PHP_EOL;//报错
 }
}
 
A::foo();
 
/*
 静态方法不能调用非静态属性 。不能使用self::调用非静态属性。
*/

做一个小总结:

最大的区别在于内存。

静态方法在程序开始时生成内存,实例方法在程序运行中生成内存,

所以静态方法可以直接调用,实例方法要先成生实例,通过实例调用方法,静态速度很快,但是多了会占内存。

任何语言都是对内存和磁盘的操作,至于是否面向对象,只是软件层的问题,底层都是一样的,只是实现方法不同。

静态内存是连续的,因为是在程序开始时就生成了,而实例申请的是离散的空间,所以当然没有静态方法快,

而且静态内存是有的,太多了程序会启动不了。

推荐教程:《php教程》

热心网友 时间:2022-04-06 09:15

1.首先用法不同,__new__()用于创建实例,所以该方法是在实例创建之前被调用,它是类级别的方法,是个静态方法;

       而 __init__() 用于初始化实例,所以该方法是在实例对象创建后被调用,它是实例级别的方法,用于设置对象属性的一些初始值。

  由此可知,__new__()在__init__() 之前被调用。如果__new__() 创建的是当前类的实例,会自动调用__init__()函数,通过return调用的__new__()的参数cls来保证是当前类实例,如果是其他类的类名,那么创建返回的是其他类实例,就不会调用当前类的__init__()函数。

  2.其次传入参数不同

  __new__()至少有一个参数cls,代表当前类,此参数在实例化时由Python解释器自动识别;

  __init__()至少有一个参数self,就是这个__new__()返回的实例,__init__()在__new__()的基础上完成一些初始化的操作。

  3.返回值不同

  __new__()必须有返回值,返回实例对象;

  __init__()不需要返回值。

  

  另外谈谈__new__()的作用,__new__()方法主要用于继承一些不可变的class,比如int, str, tuple, 提供一个自定义这些类的实例化过程的途径,一般通过重载__new__()方法来实现。代码如下

  另外__new__()方法还可以用来实现单例模式,也就是使每次实例化时只返回同一个实例对象。

热心网友 时间:2022-04-06 10:33

调用的时候效率几乎没有区别,如果只是调用一下静态方法,那么实例化一个对象的操作略显浪费资源追问谢答,不过可能是我问题没表述清楚,问题的重点应该是,通过“new实例化类”会占用资源,“直接使用类名”就不会占用资源吗?还请解惑,先谢过了

追答直接调用静态方法就是一个call语句(参数先push),和调用普通函数一样,可以参考C++编译后的汇编代码。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com