学习PHP 第五天(补充2) 访问修饰符 及静态方法和实例化类调用的区别,静态方法中调用非静态属性等一些问题

访问修饰符

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值