本文目录一览:
- 1、php"直接用类名"和"new实例化"调用函数哪种方法效率更高?
- 2、php静态方法和实例方法的区别
- 3、类中静态方法和实例方法的区别
- 4、PHP类的静态(static)方法和静态(static)变量使用介绍
- 5、关于PHP静态方法调用和实例化类调用的区别
- 6、PHP中静态方法和实例化方法的区别
php"直接用类名"和"new实例化"调用函数哪种方法效率更高?
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__()方法还可以用来实现单例模式,也就是使每次实例化时只返回同一个实例对象。
php静态方法和实例方法的区别
?php
header('content-type:text/html;charset=utf-8');
/*
普通方法,存放类内,只有一份
静态方法,也是存放于类内,只有一份
区别在于:普通方法需要对象去调用,需要绑定$this
即,普通方法,必须要有对象,然后让对象来调用
而静态方法,不属于哪一个对象,因此不需要绑定$this
即,不需要对象也可以调用
*/
class Human{
static public $head=1;
public function easyeat(){
echo '普通方法吃饭br /';
}
static public function eat(){
echo '静态方法吃饭br /';
}
public function intro(){
echo $this-name;
}
}
Error_reporting(E_ALL|E_STRICT);
//此时没有对象!方法可以执行
Human::eat();
/*
以下方法easyeat是一个非静态方法,就由对象来调用,但,用类来调用此方法来也可以执行,而严格状态下,此方法会执行,同时报错,
Strict Standards: Non-static method Human::easyeat() should not be called statically in D:\application\PHPnow-1.5.6\htdocs\yan18\types\staticfun.php on line 32
*/
Human::easyeat();
/*
接上,从逻辑来理解,如果用类名静态调用非静态(普通)方法
比如:intro()
那么,这个$this是指哪个对象呢??
因此会报错,因为找不到对象!
Fatal error: Using $this when not in object context in D:\application\PHPnow-1.5.6\htdocs\yan18\types\staticfun.php on line 23
*/
Human::intro();
/*
如上分析,其实,非静态方法,是不能由类名静态调用的,但目前,php中的面向对象检测不够严格,只要静态方法中没有$this关键字,就会转化成静态方法来处理!
*/
$li=new Human();
$li-eat();
/*
总结:
类》访问-静态方法(类的方法)-可以
类》访问-普通方法(对象的方法)-不可以(虽然方法里不用$this关键字时,可以!但不支持这种写法)
对象》访问》静态方法(类的方法)-可以
对象》访问》普通方法(对象的方法)-可以
*/
?
类中静态方法和实例方法的区别
1、调用方式上
静态方法依赖于类,通过类.静态方法调用;实例方法依赖于类的对象,需要创建对象后,对象.实例方法使用
2、使用上
实例方法内部不能定义静态变量,会出现编译错误;实例方法可以直接调用静态方法;静态方法内部可以定义和使用实例变量,静态方法无法直接调用实例方法(因静态方法加载时类还没有实例化,实例方法依赖于类的对象)
3、静态方法和实例方法的内存分配问题
一般认为静态方法常驻内存,实例方法只有在使用时才分配内存。但事实上,是一样的,都是在类被加载时常驻内存。static方法和non-static方法在创建实例对象时,属性的值对各个对象各不相同(每个实例对象的所有字段在内存中有一个拷贝,用于区分操作哪个对象的字段),new一个实例时,会把实例属性放在GC Heap里面,同时new的对象放在堆栈上,堆栈指针指向刚才拷贝的的内存地址;而静态方法中的静态字段只有一份;对于static和non-static方法代码都是一样的,所以只需要一份代码,占用一份内存空间。调用速度上因实例方法需要实例化分配内存,静态方法则不用,故静态方法会快一点,但也可忽略不计
4、区分静态方法和实例方法的原因
早期结构化编程几乎所有方法都是静态方法,引入实例化方法的概念是在面向对象概念出现以后,区分静态方法和实例方法不能单单从性能上理解。创建c++、java、c#这样面向对象语言的大师引入实例化方法一定不是要解决什么性能、内存的问题,而是为了让开发更加模式化、面向对象化。这样说的话,静态方法和实例化方式的区分是为了解决模式的问题
5、适用场景
静态方法:一个方法与类的对象无关,如工具类等
实例方法:一个方法依赖于类的对象;多线程场景下,如果静态方法中含有静态变量,如果对静态变量进行更改操作易造成线程安全问题
6、静态方法与单例模式
如果一个方法与对象的实例无关用静态方法,反之采用实例方法,但如果方法和对象的实例有关,又想维护一份实例时,需要用单例模式。如系统运行时,需要加载一些的配置和属性,是公共的,需要在整个生命周期存在,只需要一份就可以,但此时这些配置和属性又是通过面向对象的编码方式得到的,虽然用静态方法也能解决,但最好的方式是采用单例模式
PHP类的静态(static)方法和静态(static)变量使用介绍
在php中,访问类的方法/变量有两种方法:
1.
创建对象$object
=
new
Class(),然后使用”-”调用:$object-attribute/function,前提是该变量/方法可访问。
2.
直接调用类方法/变量:class::attribute/function,无论是静态/非静态都可以。但是有前提条件:
A.
如果是变量,需要该变量可访问。
B.
如果是方法,除了该方法可访问外,还需要满足:
b1)
如果是静态方法,没有特殊条件;
b2)
如果是非静态方法,需要改方法中没有使用$this,即没有调用非静态的变量/方法,当然,调用静态的变量/方法没有问题。
然后我们再看一下使用$object-…
和使用class::…
都有什么区别:
1.
使用$object-…
,需要执行构造函数创建对象;
2.
使用class::…
调用静态方法/变量,不需要执行构造函数创建对象;
3.
使用class::…
调用非静态方法/变量,也不需要执行构造函数创建对象。
然后奇怪的地方就出来了,既然2和3都一样,那静态方法/变量存在还有什么意义呢?
差异还是显然存在的,如下:
1.
静态变量
静态成员只保留一个变量值,而这个变量值对所有的实例都是有效,也就是说,所有的实例共享这个成员。
2.
静态方法
静态方法可以直接使用class::…
来调用,而非静态方法需要满足一定限制条件才能使用class::..
的方法调用,如之前所述
关于PHP静态方法调用和实例化类调用的区别
php一般是实例化 一般都是string 类型的。其实从你赋值或者声明的时候就已经算是实例化了如果你想给她转换类型需要在前面加(int)string 可以不用。其他的需要 。注意就算你$a=12345;他一样给你判定是string只有$a=(int)1234;才可以
PHP中静态方法和实例化方法的区别
当用::
使用方法是被认为该方法为静态方法,
静态方法中不允许使用$this,
因为静态方法的调用不需要实例化,
而$this是实例化後才出现的,
所以静态方法类似于一个普通的函数
静态方法
是加栽到内存.而且还少了
NEW
的内存空间.速度相对快一点效率好点。