您的位置:首页 > 编程语言 > PHP开发

php面向对象——类常量与魔术常量

2020-06-29 04:51 1016 查看

普通常量

  • 声明方式: define (‘常量名’,‘常量值’)
  • 声明后不能修改值,不能重新声明,也不能销毁
  • 声明常量后,该常量在页面任意处都可以访问 类似超级全局变量

类常量

类常量就是一个不可修改的静态属性

  • 定义方式:在类内用
    const
    常量名。 定义和使用常量不需要
    $
    符号
  • 把在类中始终保持不变的值定义为类常量,声明后不能修改值,不能重新声明,也不能销毁
class Clerk{
// 定义类常量 表示所得税
const TAX_PATE = 0.08;

public function getTax($salary){
echo '该交的税为'.$salary*self::TAX_PATE.'元';
}
}

$a = new Clerk();
$a->getTax(10000);

类常量的细节说明

  • 常量名一般全部大写,中间可以有下划线TAX_PATE
  • 定义类常量的同时,必须赋初始值,可以是整形 浮点型 字符串 布尔 数组 对象 NULL,不能是对象,变量,
  • 类常量就像静态属性一样,属于类,不属于某个对象,不复制到对象内存
  • 类常量的访问类似于静态属性
  • 类常量可以被子类继承
  • 类常量不能修改
  • 从PHP7.1开始,情况下类常量默认为public,可以使用修饰符
class Clerk{
// 定义类常量 可以为数组
const MY_CONST = array('tax_rate'=>0.08, 'pi'=>3.14);
}

$a = new Clerk();
echo Clerk::MY_CONST['pi'];
//Clerk::MY_CONST['pi'] = 0.01;   // 数组内的数据也改不了

魔术常量

  • 无法手动修改他的值,所以叫常量
  • 但是值又是随环境变化的,所以叫魔术
  • 可以写在任何位置

__FILE__返回文件当前的目录(包含文件名) 绝对路径

在框架开发或时网站的初始化脚本中,用来计算网站的根目录

echo '当前运行的是',__FILE__,'文件','<br>';	// 当前运行的是F:\wamp\www\PHP\面向对象\测试1.php文件

__LINE__返回文件当前的行号

在框架中,可以用来在debug时,记录错误信息

echo 'hi~ 我在第',__LINE__,'行','<br>';		// hi~ 我在第60行

__DIR__返回文件当前的目录(不包含文件名) 绝对路径

echo '当前目录',__DIR__,'<br>';                // 当前目录F:\wamp\www\PHP\面向对象

__CLASS__返回当前的类名 ; __METHOD__返回当前的方法名

class Human{
public function test(){
echo '你正在运行',__CLASS__,'下的',__METHOD__,'方法';
}
}

$a = new Human();
$a->test(); // 你正在运行Human下的Human::test方法

后期绑定/延迟绑定

其实很简单,知道绑定的是哪个类名之后,直接遵循权限修饰符的规则调用就行了

  • static:: 静态调用static会绑定最初调用时的类名
  • self:: 静态调用self会直接绑定他所在的类名
  • parent:: 静态调用parent会绑定所在类的父类名
  • this 绑定调用该方法的对象
  • __CLASS__返回他所在的类名

self::和static::混合练习1

class A {
public static function who() {
echo __CLASS__;
}
public static function test() {
self::who();	// A::who()     A
static::who();  // B::who()     B
}
}

class B extends A {
public static function who() {
echo __CLASS__;
}
}

B::test();

self::和static::混合练习2

class A {
public static function who() {
echo __CLASS__;
}
public static function test() {
self::who();    // A::who()   A
static::who();  // B::who()   A
}
}

class B extends A {}

B::test()

self::和static::混合练习3

class Animal{
public static $leg = 4;

public static function test(){
echo self::$leg,'<br>';
echo static::$leg,'<br>';
}
}

class Human extends Animal{
public static $leg = 2;
}

class Stu extends Human{
public static $leg = 3;
}

Stu::test();    // 4 3
Human::test();  // 4 2
Animal::test(); // 4 4

self::和static::混合练习4

class Animal{
public static $leg = 4;

public static function test(){
echo self::$leg,'<br>';
echo static::$leg,'<br>';
}
}

class Human extends Animal{
public static $leg = 2;
}

class Stu extends Human{
}

Stu::test();    // 4 2
Human::test();  // 4 2
Animal::test(); // 4 4
class A {
public static function who() {
echo __CLASS__;
}
public static function test() {
self::who();	// A
static::who();	// A
}
}

class B extends A {}

B::test();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: