PHP类:成员、静态、常量的区别和选择

PHP的类中,分为常量、静态、成员三类,初学者很容易搞混乱,笔者在学习之时也深感头疼,觉得不好理解。

分享一下学习的总结,如有错误之处敬请指正。

权限修饰符

权限修饰符用来声明变量的权限,共有三种。

public:公共权限,任何地方都可以访问,包括类外、本类中、子类。

private:私有权限,只能在本类中访问,在类外和子类中都无权访问。

protected:保护权限,只能在本类中和子类中访问,在类外不能被访问。

成员属性和成员方法

成员属性

class ClassName{
public $abc="123";//公共权限
}
$New_obj=new ClassName;//创建对象
$new_obj->abc;//调用成员属性

输出:123
class ClassName{
private $abc="123";//私有权限
}
$New_obj=new ClassName;//创建对象
$New_obj->abc;//调用成员属性

输出:Cannot access private property ClassName::$abc//权限受限,无法调用

成员属性必须声明权限,且在创建对象后才能访问;创建n个对象,就会在内存里创造N个副本。

成员方法

class ClassName{
    public $abc="123";//公共权限

    public function showABC()//成员方法
    {
       echo $this->abc="234";//将abc的值改为234并输出
    }
}
$New_obj=new ClassName;//创建对象
$New_obj->showABC();//调用成员方法

输出:234

成员方法可以不声明权限,默认是public。

静态属性和静态方法

class ClassName{
    public static $abc="123";//加入了static关键字
    public static function showABC()//加入了static关键字
    {
       echo ClassName::$abc="234";//访问方式与成员方法不同
    }
}
ClassName::showABC();//访问方式与成员方法有所不同

输出:234

静态属性不需要创建对象即可访问,创建N个对象,内存里也只有1个副本,因此比较节约内存。

常量和调用方法

class ClassName{
    const abc="123";//声明常量
}
echo ClassName::abc;

输出:123

常量不需要创建对象就可以直接访问,且没有权限修饰符,全局都可以访问,相当于public。

class ClassName{
    const abc="123";//公共权限
    function showABC(){
        echo ClassName::abc = "234";//尝试为常量重新赋值
    }
}
$New_obj=new ClassName;//创建对象
$New_obj->showABC();//函数调用方法

输出:syntax error, unexpected token "=", expecting "," or ";"

常量不可以改变,不可以重新赋值,否则会报错。

总结

在一段HTTP连接中,成员属性和静态属性都是变量,可以重新赋值,常量则不可以;假设基于该类创建了100个对象,那么就可以有100个不同的成员属性;所有对象的静态属性都相同,只能统一修改,不能单独修改某一个对象的静态属性;常量在任何地方均可访问,不可修改。

方便:成员属性>静态属性>常量

性能:常量>静态属性>成员属性

因此建议:

成员属性可以针对每个对象进行重新赋值,可用于记录会变化的、具体的数据,如姓名、身份证、电话号码等;

静态属性可以重新赋值,但该类创建的所有对象的值都一样,一般记录提炼出的“概念”,如商品的品类(手提、台式、迷你机的品类均为“电脑”)、物种划分(男性、女性、第三性别都属于“人类”)等;

常量不能重新赋值,用于记录不变的数据,如数据库连接信息、用户ID等。

原创文章,作者:STEVE,如若转载,请注明出处:https://shinecloud.com.cn

(1)
上一篇 2022年 10月 18日 下午10:54
下一篇 2022年 10月 19日 上午2:30

相关推荐

  • PHP:in_array()和array_search()的奇葩问题

    近期做项目,发现使用array_search出现的问题——搜索出错,元素分明有在数组中,但给出的结果是FALSE! 操作逻辑如下 从数据库中取出符合条件的字符串的用户id合集 使用foreach遍历这些对象 将对象中的字符串使用expl...

    2022年 11月 20日
    48
  • PHP常量:Const和Define有什么区别?

    在初学PHP时,我对这两个函数有点迷糊,虽然知道如何使用,但不知道设计这两个有什么意义。 Const const是一种语言结构,最早只能用在类(class)内,PHP5.3之后可以用在类外,实现了通用。 Define define是一个函数...

    2022年 10月 19日
    88
  • PHP:数组变量的序列化和反序列化

    序列化和反序列化是PHP操作数据库、读写文件时常见的操作。 序列化,就是将PHP的变量转化为可保存的、可传输的字符串的过程; 反序列化,则是将(序列化的)字符串转化回变量。 比如,我们需要将某学生的个人信息写...

    2022年 10月 25日
    35
  • PHP:设计模式之单例模式及数据库案例

    设计模式的定义 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性... 简而言之,就是前人...

    2022年 10月 23日
    28
  • PHP类:$this和self关键字

    $this是指向对象的指针,self是指向当前类的指针。 来一个案例 $this只能在成员方法中使用。self既可以在成员方法中使用,也可以在静态方法中使用,用来调用类的常量、静态属性和方法。 若在静态方法中调用$this关键...

    2022年 10月 19日
    35

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注