public/private/protected 访问修饰符,针对对象中的方法和属性。
<?php
class MyClass
{
private $id = 18;
public function getId()
{
return $this->id;
}
}
$obj = new MyClass();
echo $obj->getId();
//输出 18
统一的构造函数名称 __construct()。
为避免构造函数的名字和类的名字相同,现在用__construct()来声明,从而让你更加容易在类的分层中转移类
通过__destruct()定义对象的析构方法 。
允许定义一个析构函数来注销一个对象。
接口。
一个使用接口的类可以加载不止一个相关的接口,一个类只能继承来自另外一个类,但是可以实现任意多个接口。
使用接口,可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容,接口是通过interface关键字来定义的,就像一个标准的类一样,但其中定义所有的方法都是空的。接口中定义的所有方法都必须是公有的,这是接口的特性。需要注意的是,在接口中定义一个构造函数是被允许的,在有些场景析这可能会很有用,例如工厂模式。
实现(implements) 要实现一个接口,使用implements操作符。类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称
note:接口也可以继承,通过extends操作符
note:类要实现接口,必须使用和接口中定义的方法完全一直的方式,否则会导致致命错误
常量 const 接口中也可以定义常量,接口常量和类常量的使用完全相同,但是不能被子类或子接口所覆盖。
<?php
interface Display{
const VALUE_A = 'Dispaly A';//类常量
function display();
}
interface ShowIng{
function show();
}
interface Runner extends ShowIng { //接口继承
function runner();
}
class Circle implements Runner,Display { //类实现多个接口
function display()
{
return "display";
}
function show()
{
}
function runner()
{
}
}
echo Circle::VALUE_A;
//输出 Dispaly A
instanceof 操作符。
在语言这个级别对你检查“是一”关系时做支持
final标记方法。
final关键字允许你用来标识方法,使其不能被子类重载
final标记类。
声明一个类为final类型后,它将不能被继承。
<?php final class MyClass{ function getClass(){ return __CLASS__; } } class Myclass1 extends MyClass{ } $obj =new Myclass1(); echo $obj->getClass();
//Fatal error: Class Myclass1 may not inherit from final class (MyClass) in /Applications/MAMP/htdocs/php5/1.php on line 9
<?php class MyClass { function getClass() { return __CLASS__; } final function getClass1() { return "this is final function"; } } class Myclass1 extends MyClass { function getClass1() { return "this is extend final function"; } } $obj = new Myclass1(); echo $obj->getClass1();
//Fatal error: Cannot override final method MyClass::getClass1() in /Applications/MAMP/htdocs/php5/1.php on line 15
强制复制对象
为了克隆一个对象,你必须使用clone关键字。你可以在类中声明一个__clone()方法,它将在克隆过程中被调用(调用在属性和方法从原对象复制过来以后进行);
<?php class MyClass { function __construct() { print "构造方法"; } function __clone() { print "clone"; } function myClass() { print __CLASS__; } } $obj = new MyClass(); $obj1 = clone $obj; $obj1->myClass();
类中的常量
类定义中的现在包含常量,而且可以用类来引用
<?php class MyClass { const SUCCESS = "Success"; const FAILURE = "Error"; } print MyClass::SUCCESS; //Success
静态方法
你现在可以定义静态方法,不用实例化就能使用它们。静态方法不支持$this变量,因为它们并没有绑定到任何具体的对象
<?php class MyClass { static public function helloWorld() { print "hello world"; } } MyClass::helloWorld(); //hello world
静态成员
类的定义现在包含静态成员(属性),可以通过类自身来访问。
<?php class MyClass { static public $user = NULL; static public function setUser($user = 'hi') { self::$user = $user; } static public function getUser() { print self::$user; } } MyClass::setUser('userinfo'); MyClass::getUser(); //userinfo
抽象类
把类声明为抽象类可以防止它被实例化,但是你可以继承一个抽象类。
<?php abstract class MyClass { public function __construct() { print "abstract"; } } $obj = new MyClass(); // Fatal error: Cannot instantiate abstract class MyClass in /Applications/MAMP/htdocs/php5/1.php on line 11
<?php abstract class MyClass { public function __construct() { print "abstract"; } } class Myclass1 extends MyClass{ } $obj = new Myclass1(); //abstract
抽象方法
把方法声明为抽象的,以便于在继承的子类中再去定义。包含抽象方法的类本身必须是一个抽象类。
<?php abstract class MyClass { abstract public function display() { } }
对象类型提示
函数声明中可以对参数进行对象类型提示。如果函数调用的时候没有传递正确的对象类型,系统报错
<?php class Myclass { public function display() { print __CLASS__ . "--display method"; } } class Myclass1 { public function display() { print __CLASS__ . "--display method"; } } class Myclass2 { public function display(Myclass1 $obj) { $obj->display(); } } $myClassObj = new Myclass(); $myClassObj1 = new Myclass1(); $myClassObj2 = new Myclass2(); $myClassObj2->display($myClassObj); //Catchable fatal error: Argument 1 passed to Myclass2::display() must be an instance of Myclass1, instance of Myclass given, called in /Applications/MAMP/htdocs/php5/1.php on line 31 and defined in /Applications/MAMP/htdocs/php5/1.php on line 22 //此处应该传入 $myClassObj1
支持连续引用方法返回的对象
<?php class Myclass { public function show() { print __CLASS__ . "--show method"; } } class Myclass1 { public function display() { $obj = new Myclass(); return $obj; } } $obj = new Myclass1(); $obj->display()->show();