发布网友 发布时间: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++编译后的汇编代码。