0
点赞
收藏
分享

微信扫一扫

php学习笔记十:类与对象-基础


php学习笔记十:类与对象-基础


简介
自 PHP 5 起完全重写了对象模型以得到更佳性能和更多特性。这是自 PHP 4 以来的最大变化。PHP 5 具有完整的对象模型。
PHP 5 中的新特性包括访问控制,抽象类和 final 类与方法,附加的魔术方法,接口,对象复制和类型约束。 


基本概念
每个类的定义都以关键字 class 开头,后面跟着类名,后面跟着一对花括号,里面包含有类的属性与方法的定义。
类名可以是任何非 PHP 保留字的合法标签。一个合法类名以字母或下划线开头,后面跟着若干字母,数字或下划线。以正则表达式表示为:[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*。
一个类可以包含有属于自己的常量,变量(称为“属性”)以及函数(称为“方法”)。 


Example #1 简单的类定义

<?php

class SimpleClass

{

// property declaration

public $var = 'a default value';



// method declaration

public function displayVar() {

echo $this->var;

}

}

?>




Example #2 $this 伪变量的示例
当一个方法在类定义内部被调用时,有一个可用的伪变量 $this。$this 是一个到主叫对象的引用(通常是该方法所从属的对象,但如果是从第二个对象静态调用时也可能是另一个对象)。 

<?php  

class human{

public $name="李四";

public function eat(){

echo $this->name,'在吃饭';

}

public function test(){

echo $name,'在吃饭';

}

}



$li=new human();

echo $li->name;//李四

$li->eat();//李四在吃饭。

?>




Example #3 创建一个实例 new 关键字
要创建一个类的实例,必须使用 new 关键字。当创建新对象时该对象总是被赋值,除非该对象定义了构造函数并且在出错时抛出了一个异常。类应在被实例化之前定义(某些情况下则必须这样)。
如果在 new 之后跟着的是一个包含有类名的字符串,则该类的一个实例被创建。如果该类属于一个名字空间,则必须使用其完整名称。 

<?php

$instance = new SimpleClass();



// 也可以这样做:

$className = 'Foo';

$instance = new $className(); // Foo()

?>



Example #4 简单的类继承 extends 关键字
一个类可以在声明中用 extends 关键字继承另一个类的方法和属性。PHP不支持多重继承,一个类只能继承一个基类。 
被继承的方法和属性可以通过用同样的名字重新声明被覆盖。但是如果父类定义方法时使用了 final,则该方法不可被覆盖。可以通过 parent:: 来访问被覆盖的方法或属性。
当覆盖方法时,参数必须保持一致否则 PHP 将发出 E_STRICT 级别的错误信息。但构造函数例外,构造函数可在被覆盖时使用不同的参数。 


<?php

class SimpleClass

{

// property declaration

public $var = 'a default value';



// method declaration

public function displayVar() {

echo $this->var;

}

}

class ExtendClass extends SimpleClass

{

// Redefine the parent method

function displayVar()

{

echo "Extending class\n";

parent::displayVar();

}

}

$extended = new ExtendClass();

$extended->displayVar();

?>




Example #5 类名的解析 ::class 关键字
自 PHP 5.5 起,关键词 class 也可用于类名的解析。使用 ClassName::class 你可以获取一个字符串,包含了类 ClassName 的完全限定名称。这对使用了 命名空间 的类尤其有用。

<?php

namespace NS {

class ClassName {

}



echo ClassName::class;

}

?>





以上例程会输出:
NS\ClassName

举报

相关推荐

0 条评论