最近学了一点php,被有时候加有时候不加的$
搞得有点迷糊。不过终究PHP的语法和C++是比较相类似的,学起来也没有这么困难。现在来总结一下PHP中面向对象这一块,同时与C++的面向对象作一下比较。
类的定义
相同 就是PHP的不用加分号
class Noob
{……};
class Noob
{……}
对象创建
对于c++,有两种创建对象的方法。直接创建和使用指针
Noob a = Noob();
Noob* a = new Noob();
而在PHP中 只允许使用指针。
$a = new Noob();
构造函数/析构函数
PHP 的构造函数和C++就不同了 他有专门的函数构造
void __construct([mixed $args [, $...]]) //构造
void __destruct(void) //析构
相同的是,访问属性必须是public
php
function __construct($var1 , $var2)
{
$this->url = $var1;
$this->title = $var2;
}
function __destruct()
{
echo "对象析构";
}
C++
Noob(string var1 , string var2)
{
this->url = var1;
this->title = var2;
}
~Noob()
{
cout << "对象析构";
}
访问属性
C++是直接用关键字直接声明一个区域,如果没有任何声明默认是private。
php是每个变量/函数之前都要加关键字,如果不加默认public
class Noob
{
public:
Noob(int p)
{
this->a = p;
}
int returnValue()
{
return this->a;
}
private:
int a;
};
class Noob
{
var $a; //可使用var定义变量 属性public
public $b;
private $b;
public function __construct()
{
....
}
}
类继承
与C++的不同除了关键字不同 还有的就是php只允许单继承
C++
class Son : public Father
{}
class Son2 : protected Father
{}
php 相当于c++的public继承
class Son extends Father
{}
方法重写
如果从父类继承的方法无法满足子类的要求 我们可以对其进行改写。 这个过程叫做方法的覆盖。
class fin
{
function myPrint()
{
echo "print fa";
}
}
class fout extends fin
{
function myPrint()
{
echo "print son";
}
}
$f = new fout;
$f->myPrint();
结果是 print son
接口
php独有的东西
他的作用是 指定某个类必须实现哪些方法 但不需要定义这些方法的具体内容
使用interface
关键字声明一个接口
interface myPrint_interface
{
public function myPrint1($var1 , $var2);
public function myPrint2($var1);
}
要实现一个接口 使用implements
操作符 类中必须实现接口中定义的方法 ,一个类可以实现多个接口,用逗号分隔开多个接口的名称。
class myPrint implements myPrint_interface
{
public function myPrint1($var1 , $var2)
{
echo "myPrint1";
}
public function myPrint2($var1)
{
echo "myPrint2";
}
}
常量
可以把在类中始终不变的值定义为常量
但是我可以把常量随便改 这里先不写了QAQ
静态变量
和c++不同的是 php的静态变量是可以在类内直接赋值的。但是不能通过成员操作符->
访问 只能通过类名::
访问。
class sb
{
public static $f = '233';
}
echo sb::$f;
抽象类
和c++类似 只要有一个方法是抽象的 这个类就必须被声明为抽象的。首先这个类不能被实例化,且子类必须重写抽象方法。访问控制必须和父亲一样,或者比父类更宽。
abstract class Father
{
abstract public function func1();
public function func2();
}
class Son extends Father
{
public function func1()
{
echo "chong xie";
}
}
final 关键字
php 独有 如果父类中的方法被声明为final 则子类无法重写该方法,如果一个类被声明为final 则该类无法被继承
调用父类的构造方法
子类中写parent::__construct(参数)
即可。
c++中
class Father
{
public:
Father(int f)
{
cout << f << endl;
}
};
class Son : public Father
{
public:
Son(int x) : Father(x + 1)
{
cout << x << endl;
}
};