1.public 公共的方法和属性,能在所有的类中使用
2.static 静态的方法和变量
如果访问控制权限允许,可不必创建该类对象而直接使用类名加两个冒号“::”调用,static的属性,在内存中只有一份,为所有的实例共用, 静态方法不能调用非静态属性 。不能使用self::调用非静态属性。
function test(){
static $a=1;
$a*=2;
echo $a."\n";
}
test()
test()
test()
//打印结果
//2
//4
//8
静态变量的初始化赋值只有一次,后面的test方法不会再初始化。
3.private 修饰的方法和变量是私有的,只能在本类中调用(在其他的类中实例化本类,是无法调用private修饰的方法和变量)
4.proteced 受保护的方法和变量,只能在本类和本类的子类中使用
5.final 修饰的方法不能被覆盖。
<?php
header("content-type:text/html;charset=utf-8");
class Human{
static public $name = "小妹";
public $height = 180;
static public function tell(){
echo self::$name;//静态方法调用静态属性,使用self关键词
//echo $this->height;//错。静态方法不能调用非静态属性
//因为 $this代表实例化对象,而这里是类,不知道 $this 代表哪个对象
}
public function say(){
echo self::$name . "我说话了";
//普通方法调用静态属性,同样使用self关键词
echo $this->height;
}
}
$p1 = new Human();
$p1->say();
$p1->tell();//对象可以访问静态方法
echo $p1::$name;//对象访问静态属性。不能这么访问$p1->name
//因为静态属性的内存位置不在对象里
Human::say();//错。say()方法有$this时出错;没有$this时能出结果
//但php5.4以上会提示
?>
-------------------------
结论:
1、静态属性的调用,用self:: ,无论是静态或非静态方法都可以调用静态属性;
2、静态方法可以调用非静态方法,使用 self 关键词。php里,一个方法被self:: 后,它就自动转变为静态方法;
3、静态方法不能调用非静态属性。因为非静态属性需要实例化后,存放在对象里;
PHP 类中静态方法内调用非静态方法
静态方法中调用非静态方法: 在类的静态方法中,需要实例化对象,然后再调用类中的方法
非静态方法中调用静态方法: 可以self
或者 类名加::
的形式调用
如下面的案例:
<?php
class A{
public function noneStaticFun(){
echo __CLASS__." none static function<br/>";
}
public static function staticFun(){
echo __CLASS__." static function<br/>";
//静态方法调用非静态方法,需要实例化对象然后再调用对象中的非静态方法
//静态方法内不能调用非静态属性
(new A())->noneStaticFun();
}
public function testCallStaticFun(){
echo "call static function<br/>";
//调用本类的静态方法,使用 self关键字或者类名 (不能使用self::调用非静态属性)
self::staticFun();
//A::staticFun(); //也可以使用这种方式
//调用其它类的静态方法,直接使用类名::方法名的形式调用
B::myStaticFun();
}
}
class B{
public static function myStaticFun(){
echo __CLASS__." static function<br/>";
}
}
//演示
$testA = new A();
$testA->testCallStaticFun();
A::staticFun();
--------------------
运行结果:
call static function
A static function
A none static function
B static function
A static function
A none static function
原文链接:https://www.cnblogs.com/fsong/p/11337011.html
PHP中静态方法调用和实例化类调用的区别
1、观点一:
- 静态方法只有一个,无论你调用多少次,都是共用的,是没有对象的概念,因此不能在静态方法里面使用$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::调用非静态属性。
*/
小总结:最大的区别在于内存。
静态方法在程序开始时生成内存, 实例方法在程序运行中生成内存,
所以静态方法可以直接调用,实例方法要先成生实例,通过实例调用方法,静态速度很快,但是多了会占内存。
静态内存是连续的,因为是在程序开始时就生成了,而实例申请的是离散的空间,所以当然没有静态方法快,
而且静态内存是有限制的,太多了程序会启动不了。
————————————————
原文链接:https://blog.csdn.net/GP_666/article/details/84886837