1.构造和析构
function __construct(para,para…)
{
…
}
function __destruct()
{
…
}
Note: 如果子类中定义了构造函数则不会隐式调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用 parent::__construct()。如果子类没有定义构造函数则会如同一个普通的类方法一样从父类继承(假如没有被定义为 private 的话)。和构造函数一样,父类的析构函数不会被引擎暗中调用。要执行父类的析构函数,必须在子类的析构函数体中显式调用 parent::__destruct()。此外也和构造函数一样,子类如果自己没有定义析构函数则会继承父类的。
在类定义内部,可以用 new self 和 new parent 创建新对象。
如果在 new 之后跟着的是一个包含有类名的字符串,则该类的一个实例被创建。如果该类属于一个名字空间,则必须使用其完整名称。
<?php
$instance = new SimpleClass();
// 也可以这样做:
$className = 'Foo';
$instance = new $className(); // Foo()
?>
3.对象赋值语句是引用传递
$a = new foo;
$b = $a; //对象的赋值与函数赋值一样,是传递引用。
$b->t = "data"; //这里对象a的值同样被改变。
//如果不想传递引用,则需要自己定义clone方法。
4.类只支持单继承
class ExtentdClass extends BaseClass
{
function display() //覆盖父类的方法
{
echo "Extentded class";
parent::display(); //调用父类的方法通过 parent::
}
}
5.属性
在老版本中,定义类属性需要加var,新版本中已经不需要,直接加public,protected,private修饰即可。这三个修饰符的使用跟C++中相同。静态属性用self::$data访问,非静态用 $this->data访问;注意$this->后面没有$✨
静态属性不可以用instance->data访问。
6.方法
方法如果不加public,protected,private修饰则默认是共有的。保护的方法可以通过instance->method调用,私有的不可以。
静态方法可以用 instance->method访问,单静态属性不可以。静态属性只能出世华为文字或常量,不能用变量,表达式。
7.其他对象的访问控制
同一个类的对象即使不是同一个实例也可以互相访问对方的私有与受保护成员。这是由于在这些对象的内部具体实现的细节都是已知的。
8.类常量
可以把在类中始终保持不变的值定义为常量。在定义和使用常量的时候不需要使用 $ 符号。
常量的值必须是一个定值,不能是变量,类属性,数学运算的结果或函数调用。
class MyClass {
const data = “const”;
}
访问常量时同静态变量一样,用范围解析操作符 ::
MyClass::data , self::data
9.抽象类
同C++类似,抽象类中可以定义方法的内容,可以定义属性。
继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。
<?php
abstract class AbstractClass
{
// 强制要求子类定义这些方法
abstract protected function getValue();
abstract protected function prefixValue($prefix);//子类可以在定义了$prefix的基础上定义更多参数
// 普通方法(非抽象方法)
public function printOut() {
print $this->getValue() . "\n";
}
}
10.接口
关键字 interface定义接口,不需要想abstract那样在后面加class关键字。
要实现一个接口,使用 implements 操作符。类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称。
Note:
实现多个接口时,接口中的方法不能有重名。
Note:
接口也可以继承其他接口,通过使用 extends 操作符。
接口中也可以定义常量。接口常量和类常量的使用完全相同,但是不能被子类或子接口所覆盖。
接口中不能定义函数实现体,不能定义非const属性,抽象类中可以。
<End>
function __construct(para,para…)
{
…
}
function __destruct()
{
…
}
Note: 如果子类中定义了构造函数则不会隐式调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用 parent::__construct()。如果子类没有定义构造函数则会如同一个普通的类方法一样从父类继承(假如没有被定义为 private 的话)。和构造函数一样,父类的析构函数不会被引擎暗中调用。要执行父类的析构函数,必须在子类的析构函数体中显式调用 parent::__destruct()。此外也和构造函数一样,子类如果自己没有定义析构函数则会继承父类的。
2.New关键字
在类定义内部,可以用 new self 和 new parent 创建新对象。
如果在 new 之后跟着的是一个包含有类名的字符串,则该类的一个实例被创建。如果该类属于一个名字空间,则必须使用其完整名称。
<?php
$instance = new SimpleClass();
// 也可以这样做:
$className = 'Foo';
$instance = new $className(); // Foo()
?>
3.对象赋值语句是引用传递
$a = new foo;
$b = $a; //对象的赋值与函数赋值一样,是传递引用。
$b->t = "data"; //这里对象a的值同样被改变。
//如果不想传递引用,则需要自己定义clone方法。
4.类只支持单继承
class ExtentdClass extends BaseClass
{
function display() //覆盖父类的方法
{
echo "Extentded class";
parent::display(); //调用父类的方法通过 parent::
}
}
5.属性
在老版本中,定义类属性需要加var,新版本中已经不需要,直接加public,protected,private修饰即可。这三个修饰符的使用跟C++中相同。静态属性用self::$data访问,非静态用 $this->data访问;注意$this->后面没有$✨
静态属性不可以用instance->data访问。
6.方法
方法如果不加public,protected,private修饰则默认是共有的。保护的方法可以通过instance->method调用,私有的不可以。
静态方法可以用 instance->method访问,单静态属性不可以。静态属性只能出世华为文字或常量,不能用变量,表达式。
7.其他对象的访问控制
同一个类的对象即使不是同一个实例也可以互相访问对方的私有与受保护成员。这是由于在这些对象的内部具体实现的细节都是已知的。
8.类常量
可以把在类中始终保持不变的值定义为常量。在定义和使用常量的时候不需要使用 $ 符号。
常量的值必须是一个定值,不能是变量,类属性,数学运算的结果或函数调用。
class MyClass {
const data = “const”;
}
访问常量时同静态变量一样,用范围解析操作符 ::
MyClass::data , self::data
9.抽象类
同C++类似,抽象类中可以定义方法的内容,可以定义属性。
继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。
<?php
abstract class AbstractClass
{
// 强制要求子类定义这些方法
abstract protected function getValue();
abstract protected function prefixValue($prefix);//子类可以在定义了$prefix的基础上定义更多参数
// 普通方法(非抽象方法)
public function printOut() {
print $this->getValue() . "\n";
}
}
10.接口
关键字 interface定义接口,不需要想abstract那样在后面加class关键字。
要实现一个接口,使用 implements 操作符。类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称。
Note:
实现多个接口时,接口中的方法不能有重名。
Note:
接口也可以继承其他接口,通过使用 extends 操作符。
接口中也可以定义常量。接口常量和类常量的使用完全相同,但是不能被子类或子接口所覆盖。
接口中不能定义函数实现体,不能定义非const属性,抽象类中可以。
<End>