随笔 - 72,  文章 - 0,  评论 - 1,  阅读 - 22557

在 PHP 中,构造函数是一个特殊的方法,用于在创建对象时初始化对象的状态。构造函数在对象实例化时自动调用,以设置初始值或执行必要的准备工作。它可以接受参数,用于初始化对象的属性。

构造函数的特点

  1. 自动调用: 构造函数在创建对象时自动调用。你不需要显式调用构造函数,它会在实例化对象时自动执行。

  2. 参数传递: 构造函数可以接收参数,这些参数可以用来初始化对象的属性。

  3. 重载: PHP 不支持方法重载,因此一个类中只能有一个 __construct 方法。如果需要不同的构造逻辑,可以使用默认参数值或通过参数类型来处理。

  4. 继承: 如果子类定义了构造函数,它不会自动调用父类的构造函数。如果需要调用父类的构造函数,可以使用 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();
复制代码

回显如下:

[Running] D:\ceshi.test\1.php"
fish 的年龄是 1699 天,出生日期为 2020-01-02
 
 
析构函数
析构函数在 PHP 中是一个特殊的方法,用于在对象销毁时执行清理操作。它的定义使用 __destruct 方法名。析构函数会在对象的生命周期结束时自动调用,通常用于释放资源、关闭文件或数据库连接等。
  • 析构函数 用于对象销毁时执行清理操作。
  • 定义: 使用 __destruct 方法定义析构函数。
  • 自动调用: 在对象生命周期结束时自动调用析构函数。
  • 资源释放: 常用于释放对象占用的资源。
  • 继承: 子类的析构函数可以调用父类的析构函数。
复制代码
class SimpleClass {
    // 构造函数
    public function __construct() {
        echo "对象创建了\n";
    }

    // 析构函数
    public function __destruct() {
        echo "对象销毁了\n";
    }
}

// 创建对象
$instance = new SimpleClass();

// 当脚本执行完毕或使用 unset() 销毁对象时,析构函数会被调用
unset($instance);
复制代码

回显如下:

[Running] D:\ceshi.test\4.php"
对象创建了
对象销毁了
 

静态变量

在 PHP 中,静态变量是函数内的一种特殊类型的变量,其生命周期不同于普通局部变量。静态变量的主要特点包括:

  1. 持久性:静态变量在函数调用结束后仍然存在。它们的值不会被销毁,而是在后续的函数调用中保持其值。

  2. 共享状态:静态变量的值在多个函数调用之间保持一致,这使得它们在保存状态或累积值时特别有用。

  3. 只初始化一次:静态变量只会在第一次执行到它们的定义时进行初始化,此后不会重新初始化。

使用场景

静态变量在以下场景中特别有用:

  • 计数器:用于跟踪函数的调用次数或其他累积统计。
  • 状态保持:在函数中保存状态信息,如缓存计算结果,避免重复计算。
  • 工厂模式:在对象创建的工厂方法中保持实例化计数或缓存实例。

注意事项

  • 静态变量的作用范围仅限于定义它们的函数内部,外部代码无法直接访问这些静态变量。
  • 静态变量的值在脚本的生命周期内是持久的,除非脚本执行结束或变量被显式重置。

来看下面的这段代码

 

复制代码
    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();
复制代码

回显如下:

[Running] D:\ceshi.test\3.php
jingtaifox is eatting
 
再继续看
复制代码
    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();
复制代码

回显如下:

[Running] D:ceshi.test\3.php
huli is eatting
xiaoyu is eatting
由此可见,静态变量归属于类class,而非实例。

假设你有一个公共的储物柜,你和你的朋友们都可以用这个储物柜存放和取出东西。无论你还是你的朋友们,都只能使用这个共同的储物柜,而不是各自独立的储物柜。

PHP 中的静态变量

在 PHP 中,静态变量就像这个共享的储物柜:

  1. 共享:所有对象都访问的是同一个静态变量(储物柜),而不是各自的副本。
  2. 持久性:储物柜中的内容在程序运行过程中一直存在,创建或销毁对象时不会改变储物柜的内容。
  3. 访问:你和你的朋友们可以通过一个固定的方式来查看储物柜中的内容。

 类常量的定义以及调用

复制代码
  class Animal {

       const CHANGLIANG='this is constant';  //const 定义常量

        public function eat(){

            echo self::CHANGLIANG ;   使用self::CHANGLIANG调用
           
        }  

    }
 
 
  $fox = new Animal;

  $fox->eat();
复制代码

回显如下:

[Running] D:\ceshi.test\3.php
this is constant
 

在 PHP 中,defineconst 都用于定义常量,但它们有一些不同的特性和使用场景。以下是对 defineconst 的详细比较和说明:

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 Code
    const 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
      }

       

主要区别总结

  1. 作用范围:

    • define 定义的常量是全局的。
    • const 定义的常量可以在类或命名空间中使用,作用范围更为局限。
  2. 定义位置:

    • define 可以在全局作用域、函数内部等任意位置使用。
    • const 只能在类或命名空间的顶层使用。
  3. 表达式:

    • define 支持更复杂的表达式和函数调用。
    • const 只能使用常量或简单的表达式进行初始化。
  4. 大小写:

    • define 可以设置是否对常量名区分大小写。
    • const 的常量名是区分大小写的。

在实际编程中,根据需要选择 defineconst,例如,在类中定义常量时使用 const,在全局范围中定义常量时可以使用 define

静态方法

 

复制代码
 class Animal {

        public static $name='cat';

       
        public static function eat(){    //定义静态方法

            echo self::$name;           //访问静态变量
        }
   }  


  Animal::eat();
复制代码

回显如下:

[Running] D:\ceshi.test\3.php"
cat
也可以静态方法中调用静态方法
复制代码
    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();
复制代码

回显如下:

[Running] D:\ceshi.test\3.php
this is constant
 
接下来变化一下,看看如何调用非静态的方法和非静态的变量
复制代码
    class Animal {

        public $name='cat';     //非静态变量
       

        public static function eat(){

            echo (new self)->name;   // 使用这种形式调用非静态变量name
        }
   }  


  Animal::eat();
复制代码

回显如下:

[Running] D:\ceshi.test\3.php
cat
 
同样,也可以调用非静态方法
复制代码
    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();
复制代码
[Running] D:\ceshi.test\3.php"
this is constant
 
posted on   wilson'blog  阅读(51)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示