php静态方法调用非静态方法
‘壹’ 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请问在static的function中如何访问变量
静态方法只能访问其他的静态方法或属性,比如
classA{
privatestatic$url;
($url){
self::$url=$url;
}
(){
returnself::$url;
}
}
//或者在你的静态方法中获得实例,当然这样的悔镇话可能达不到你预期的效果,推荐你还是使用上面的方法。
classA{
private$url='demo';
publicstaticfunctiongetUrl(){
陪前磨芦斗$obj=newself();
return$obj->url;
}
}
‘叁’ 拍黄片,简称php,弱弱的问一下,这小段话该怎么理解。
这句话 主要就是想表达
PHP可以静态调用非静态方法 就是这样
不过 静态调用非静态方法的效率要比标准的静态方法调用低的多,所以在效率上也不推荐静态调用非静态方法。
另外 在代码的可读性上来看,静态调用非静态方法当然是不被推荐的
所以 在使用java等程序员眼中 php就是乱来 如果这种方法在java程序中使用,肯定会报错的
‘肆’ php中::代表什么意思
php中的::是调用类中的静态方法或者常量,属性的符号
例如
class aaa{
static function ar(){
}
function br(){}
}
使用非静态方法,要先创建实例
$obj = new aaa();
$obj -> br();
使用静态方法,无需创建实例,直接使用类名
aaa::ar();
‘伍’ PHP静态方法和非静态方法的区别
静态方法必须使用static关键字声明,面向对象编程中我们通常通过类的实例(而不是类的本身)来调用类,类其实是对象的模板,但是静态方法区别于普通类,它不仅可以通过类的实例来调用,还可以通过类来访问他们,比如 Game::getGame(); 使用类调用的时候使用::,在当前类调用还可以使用self关键字,比如 self::getGame(); 静态方法是以类为作用域,不能访问类中的普通属性,因为他们属于一个对象,但可以访问静态属性。不知道你明白了没有
‘陆’ thinkphp5是如何做到非静态方法使用db::table()可以调用
PHP 有个 __callStatic 方法了解一下;
class A {
public static function __callStatic( $name, $args) {
// 当调用了类中不存在的静态方法时,会自动执行这个方法
// 然后在这个方法中可以去主动调用非静态方法
return self::$name( ...$args );
// $name 是方法名称, $args 是调用方法时传的参数
}
public function demo() {
echo 'this is demo function';
}
}
print_r( A::demo() );
‘柒’ php中相同名称的方法,父类方法为静态子类能否为非静态方法
不可以。
子类会继承父类中的静态方法,相当于在子类中定义了同名的静态方法和成员方法。
这样当在子类上调用该方法时,会产生歧义,因为无法确定调用的是静态还是非静态方法,所以编译器不允许这样的情况发生。
‘捌’ php文件怎样调用class.php中的方法
调用方法,得看该方法是 静态方法 还是 非静态方法
如果类里定义的该方法带有 static 关键字,那么就是静态方法
调用静态方法很简单,直接 类名::方法名 即可,例如:Person::study();
调用非静态方法,得先用该类实例化出一个对象,然后才能用对象调用非静态方法,例如:
$a=new class(); $a->study();
当然不管怎么调用,如果调用的文件和定义类的文件不是同一个文件,那么都得在调用的文件里先包含类文件,才能调用方法,包含文件用 include 或 require 后跟字符串文件路径