面向对象之常量和静态属性

一、类常量

定义

const PI = 3.14;


在类外部可以使用​define​和​const​定义常量.但在类内部只能使用​const​定义常量.

定义常量名称一般都大写,这是一个约定.

如果定义的常量有多个单词组成,使用​​_​​连接,这也是约定。

调用

class Math
{
const PI = 3.14;
public function __construct()
{
echo "这是Math类。里面定义了一个常量".self::PI;
}
}
echo Math::PI; //类名::常量名
$m = new Math(); //self::常量名


常量前面不能加访问修饰符

二、静态属性和静态方法

如果用来关键字​static​修饰属性和方法之后,那么该属性和方法是属于整个类的,不是属于某个对象的

class MyObject
{
public static $a = 0;
function MyMethod()
{
self::$a += 2;
echo self::$a . "\n";
}
}

$instance1 = new MyObject();
$instance1 -> MyMethod();

$instance2 = new MyObject();
$instance2 -> MyMethod();


静态方法注意项:

1、静态属性和方法前面可以加访问修饰符

class Student 
{
public $name;

public static function tell()
{
echo '我是一个静态方法';
}
}


2、静态方法中不能出现​​$this​​关键字.this代表的是对象

class Student 
{
public static $name;
public $age;

public static function tell()
{
echo '我是一个静态方法';
echo self::$name;//静态方法调用静态属性,使用self关键词
echo $this->age;//此处报错。静态方法不能调用非静态属性
}
}
Student::tell();


2、对象能够访问静态方法

$stu = new Student();
$stu->tell();


3、静态属性和静态方法效率高

4、通过静态 方法来创建单例对象

三、几个操作符

​$this​

指标是类的当前实例,是当前对象的引用。

​self::​

表示的是类本身,使用 self:: 时必须在操作符后面加上 ​​$​​ 符号,在类之外的代码中不能使用这个操作符,而且它 不能识别自己在继承树层次结构中的位置 在扩展类中使用 self:: 作用域时, self 可以调用基类中声明的方法,但它调用的总是已经在扩展类中重写的方法。

class A
{
public function say()
{
echo 'xxx';
}
}
class B extends A
{
public function youSay(){
self::say();
}
}

$b = new B();
$b->youSay(); // xxx


​parent::​

在扩展类中,在基(父)类的方法被重写的情况下,如果你要访问基类的方法,可以使用 parent::

​static::​

使我们不再需要使用 self:: 和 parent:: 。当希望指向最终的实现功能的类时,就可以使用​static​,这个限定符会在代码执行之前立即计算出继承层次结构上最后那个类的成员

class A
{
public static function demo()
{
echo static::test();
}
public static function test()
{
return 'test-A';
}
}

class B extends A
{
public static function test()
{
return 'test-B';
}
}

class C extends A
{
public static function test2()
{
return 'test-C';
}
}
echo C::demo();