拦截器
class Computer{ // 类属性 成员 private $_name ; private $_cpu ; private $_model ; public function __construct() { echo "<meta charset=utf8>"; } // __set() 和__get()方法私有了,还是可以执行,是因为 //目前程序的指针已经在类内了,而类内可以执行封装的方法 //类内执行私有方法,不会出现任何错误, // 但是会出现警告,对于应用程序的使用是没有任何问题的 // 它只需要间接的拦截就可以了,拦截是在类内执行的。根本就不需要对它类外执行 // 避免暴露更多细节 // 说白了,__set()和__get()是php的内置方法,具有一定的特殊性 private function __set($name, $value) { $this->$name=$value; } private function __get($name) { return $this->$name; } } $computer1 = new Computer(); $computer1->_name = "联想"; $computer1->_cpu = "4核"; $computer1->_model = "i7"; echo $computer1->_name; echo $computer1->_cpu; echo $computer1->_model;
以下为警告信息,此处为开发模式下,将错误显示打开
常量
常量(constent)
在类中可以定义常量,用来表示不会改变的值。对于从类实例化的任何对象来说,常量值在这些对象的生命周期中保持不变。常量不在堆栈中,而在数据区中。常量建议使用大写字母
class Computer{ const PI = 3.1415926; } //常量输出方法 类::常量 echo Computer::PI;
静态类成员
有时候,可能需要创建所有类实例共享的字段和方法,这些字段和方法与所有的类实例有关,但不能由任何特定对象调用。
class Computer{ public static $_count=0; } echo Comoputer::$_count;
一般来说,必须将字段做成私有化,所以可能需要这么做:
对比堆区与数据区
堆区:
class Computer{ // $_count是一个变量,存放在堆区,每一个实例化的对象都会在堆区有一个$_count变量,即堆区的变量独占 public $_count=0; public function _add(){ // $this->_count++ 相当于 $count=$count+1 $this->_count++; } } $computer1 = new Computer(); $computer1->_add(); $computer1->_add(); $computer1->_add(); echo $computer1->_count; echo "<br>"; $computer2 = new Computer(); $computer2->_add(); $computer2->_add(); $computer2->_add(); echo $computer2->_count;
数据区(静态区):
class Computer{ // static 是将数据存放在了数据区,数据区是共享的区域,每个对象都可以向这里写入数据 public static $_count=0; public function _add(){ // 静态区的类外数据调用格式 类:: 变量 // 类内可以使用 self::变量 格式 self::$_count++; } } $computer1 = new Computer(); $computer1->_add(); $computer1->_add(); $computer1->_add(); // 类外调用数据区静态变量 echo Computer::$_count; echo "<br>"; $computer2 = new Computer(); $computer2->_add(); $computer2->_add(); $computer2->_add(); // 类外调用数据区静态变量 echo Computer::$_count;
堆区---栈区---数据区对比图
方法和成员字段,如果都在静态区,那么可以直接使用类的静态方法调用,实现成员字段的变量,而不需要实例化
class Computer{ // 静态成员(属性) public static $_count=0; //静态方法 public static function _add(){ self::$_count++; } } // 将数据存放在数据静态区 // 无需要实例化,打印变量, Computer::$_count++; Computer::$_count++; Computer::$_count++; echo Computer::$_count;
Instansof关键字
php5有一个instansof关键字,使用这个关键字可以确定一个对象是类的实例、类的子类,还是某个特定接口,并进行相应的操作
class Computer{} $comoputer1 = new Computer(); $comopute1=0; // instanceof 使用格式 //对象名称 instanceof 类名称 // 这里为了提高优先级使用了() 小括号,建议在生产环境中使用, // 如果对象在类的实例,则返回true // 否则返回 false var_dump ($comoputer1 instanceof Computer);
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步