在 PHP 中,构造函数是一个特殊的方法,用于在创建对象时初始化对象的状态。构造函数在对象实例化时自动调用,以设置初始值或执行必要的准备工作。它可以接受参数,用于初始化对象的属性。
构造函数的特点
-
自动调用: 构造函数在创建对象时自动调用。你不需要显式调用构造函数,它会在实例化对象时自动执行。
-
参数传递: 构造函数可以接收参数,这些参数可以用来初始化对象的属性。
-
重载: PHP 不支持方法重载,因此一个类中只能有一个
__construct
方法。如果需要不同的构造逻辑,可以使用默认参数值或通过参数类型来处理。 -
继承: 如果子类定义了构造函数,它不会自动调用父类的构造函数。如果需要调用父类的构造函数,可以使用
parent::__construct()
来显式调用。
看下面的一个例子
class Animal{ private $name; private $birth; private $age; public function __construct($name,$birth){ //通过构造函数将 name birth变量传入下面进行赋值,计算等操作 $this->name = $name; $this->birth = $birth; $this->age = floor((time() - strtotime($birth)) / 3600 / 24); } public function eat(){ echo $this->name." is eatting"; } public function getInfo(){ echo "$this->name 的年龄是 $this->age 天,出生日期为 $this->birth"; } } $fish = new Animal('fish',"2020-01-02"); $fish -> getInfo();
回显如下:
__destruct
方法名。析构函数会在对象的生命周期结束时自动调用,通常用于释放资源、关闭文件或数据库连接等。- 析构函数 用于对象销毁时执行清理操作。
- 定义: 使用
__destruct
方法定义析构函数。 - 自动调用: 在对象生命周期结束时自动调用析构函数。
- 资源释放: 常用于释放对象占用的资源。
- 继承: 子类的析构函数可以调用父类的析构函数。
class SimpleClass { // 构造函数 public function __construct() { echo "对象创建了\n"; } // 析构函数 public function __destruct() { echo "对象销毁了\n"; } } // 创建对象 $instance = new SimpleClass(); // 当脚本执行完毕或使用 unset() 销毁对象时,析构函数会被调用 unset($instance);
回显如下:
静态变量
在 PHP 中,静态变量是函数内的一种特殊类型的变量,其生命周期不同于普通局部变量。静态变量的主要特点包括:
-
持久性:静态变量在函数调用结束后仍然存在。它们的值不会被销毁,而是在后续的函数调用中保持其值。
-
共享状态:静态变量的值在多个函数调用之间保持一致,这使得它们在保存状态或累积值时特别有用。
-
只初始化一次:静态变量只会在第一次执行到它们的定义时进行初始化,此后不会重新初始化。
使用场景
静态变量在以下场景中特别有用:
- 计数器:用于跟踪函数的调用次数或其他累积统计。
- 状态保持:在函数中保存状态信息,如缓存计算结果,避免重复计算。
- 工厂模式:在对象创建的工厂方法中保持实例化计数或缓存实例。
注意事项
- 静态变量的作用范围仅限于定义它们的函数内部,外部代码无法直接访问这些静态变量。
- 静态变量的值在脚本的生命周期内是持久的,除非脚本执行结束或变量被显式重置。
来看下面的这段代码
class Animal { public $name = 'fox'; public static $fox = 'jingtaifox'; //用static关键字 定义静态变量 public function eat(){ echo self::$fox .' is eatting'."\n"; //调用静态变量使用self::的形式调用 } } $Animal1 = new Animal; $Animal1->eat();
回显如下:
class Animal { public $name = 'fox'; public static $fox = 'jingtaifox'; //静态变量的值在这里被设为jingtaihuli public function eat(){ echo self::$fox .' is eatting'."\n"; } } $fox = new Animal; Animal::$fox='huli'; //以这种类名::的方式访问到静态变量fox,并给它赋值为huli $fox->eat(); $fish = new Animal; Animal::$fox='xiaoyu'; //同理,又new了一个实例,将静态变量赋值xiaoyu,看看运行结果 $fox->eat();
回显如下:
假设你有一个公共的储物柜,你和你的朋友们都可以用这个储物柜存放和取出东西。无论你还是你的朋友们,都只能使用这个共同的储物柜,而不是各自独立的储物柜。
PHP 中的静态变量
在 PHP 中,静态变量就像这个共享的储物柜:
- 共享:所有对象都访问的是同一个静态变量(储物柜),而不是各自的副本。
- 持久性:储物柜中的内容在程序运行过程中一直存在,创建或销毁对象时不会改变储物柜的内容。
- 访问:你和你的朋友们可以通过一个固定的方式来查看储物柜中的内容。
类常量的定义以及调用
class Animal { const CHANGLIANG='this is constant'; //const 定义常量 public function eat(){ echo self::CHANGLIANG ; 使用self::CHANGLIANG调用 } } $fox = new Animal; $fox->eat();
回显如下:
在 PHP 中,define
和 const
都用于定义常量,但它们有一些不同的特性和使用场景。以下是对 define
和 const
的详细比较和说明:
define
-
用途:
define
用于定义全局常量。 -
语法:
define('CONSTANT_NAME', 'value', case_insensitive);
'CONSTANT_NAME'
:常量名(通常使用大写字母)。'value'
:常量的值。case_insensitive
:可选参数,是否对常量名不区分大小写(默认为false
)。
-
特点:
define
可以在任何地方使用,包括类外部和函数内部。- 常量在定义后不能修改。
- 在 PHP 5.3 及更高版本中,
define
可以定义区分大小写的常量,默认情况下是区分大小写的。 - 不支持定义数组类型的常量。
- 常量定义不会受到类和命名空间的影响,因此在任何地方都能访问。
-
示例:
define('SITE_NAME', 'My Website'); echo SITE_NAME; // 输出: My Website
const
-
用途:
const
用于定义类中的常量或在命名空间中定义全局常量。 -
语法:
phpCopy Codeconst CONSTANT_NAME = 'value';
CONSTANT_NAME
:常量名(通常使用大写字母)。'value'
:常量的值。
-
特点:
const
只能在类或命名空间的顶部定义类常量或命名空间常量,不能在函数内部使用。const
支持在定义时使用表达式(如常量、运算符等)作为值,但不能使用函数调用或复杂的表达式。- 在类中定义的常量属于类的范围,使用
self::CONSTANT_NAME
或ClassName::CONSTANT_NAME
访问。 - 在命名空间中定义的常量是全局的,可以直接使用。
-
示例:
-
在类中:
class MyClass { const MY_CONSTANT = 'Class Constant'; } echo MyClass::MY_CONSTANT; // 输出: Class Constant
-
在命名空间中:
namespace MyNamespace { const MY_CONSTANT = 'Namespace Constant'; echo MY_CONSTANT; // 输出: Namespace Constant }
-
主要区别总结
-
作用范围:
define
定义的常量是全局的。const
定义的常量可以在类或命名空间中使用,作用范围更为局限。
-
定义位置:
define
可以在全局作用域、函数内部等任意位置使用。const
只能在类或命名空间的顶层使用。
-
表达式:
define
支持更复杂的表达式和函数调用。const
只能使用常量或简单的表达式进行初始化。
-
大小写:
define
可以设置是否对常量名区分大小写。const
的常量名是区分大小写的。
在实际编程中,根据需要选择 define
或 const
,例如,在类中定义常量时使用 const
,在全局范围中定义常量时可以使用 define
。
静态方法
class Animal { public static $name='cat'; public static function eat(){ //定义静态方法 echo self::$name; //访问静态变量 } } Animal::eat();
回显如下:
class Animal { public static $name='cat'; const CHANGLIANG='this is constant'; public static function say(){ echo self::CHANGLIANG ; } public static function eat(){ echo self::say(); //eat的静态方法中调用 say的静态方法 } } Animal::eat();
回显如下:
class Animal { public $name='cat'; //非静态变量 public static function eat(){ echo (new self)->name; // 使用这种形式调用非静态变量name } } Animal::eat();
回显如下:
class Animal { public $name='cat'; const CHANGLIANG='this is constant'; public function say(){ echo self::CHANGLIANG; } public static function eat(){ echo (new self)->say(); //调用非静态的方法say,前提是要new self 就是要把自己实例化才能调用 } } Animal::eat();
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)