面向对象编程就是要把需要解决的问题抽象为类。关于面向对象的思想我想大家都应该在其他语言中或多或少了解过。简单来说就是将事物具有的共性抽出来作为类的属性,
与属性相关的操作作为类方法。
在php中申明一个类需要使用关键字class来实现。这于其他语言是相同的。比如我们声明一个学生的类,例如:
class student{
private $name;
private $sex;
private $age;
private $classes;
public function setName($values)
{
$this->name = $values;
}
public function setSex($param) {
$this->sex = $param;
}
public function setAge($param) {
$this->age = $param;
}
public function setClasses($param) {
$this->classes = $param;
}
}
上面代码声明了一个包含学生姓名,性别,年龄和班级的类。其中姓名,性别,年龄和班级是作为student类的私有变量(属性),其中的set方法作为类的公有方法。
关键字public和private定义的是属性和方法的访问权限。private定义的属性只能在类内部使用,public定义的属性或者方法则可以在类的外部被调用。
构造函数和析构函数
构造函数是在对象实例创建的时候自动调用的方法,相反析构函数是在对象销毁的时候自动调用的方法。
构造函数通过__construct定义,析构函数通过__destruct定义。
其中构造函数主要用于创建对象时候初始化成员变量.
class ClassName {
public $name;
public $age;
function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
echo "construct excute by auto";
}
function getValue() {
echo "<br/>";
echo "姓名:" . $this->name;
echo "<br/>";
echo "年龄:" . $this->age;
}
function __destruct() {
echo "destruct excute by auto";
}
}
$obj = new ClassName("莉莉", 25);
$obj->getValue();
--->
construct excute by auto
姓名:莉莉
年龄:25destruct excute by auto
访问类中的成员:
如果是在类内部访问成员上面的例子就可以看出来,使用->操作符可以访问类成员。另外在对象的方法执行的时候会自动定义一个特殊变量,那就是上面例子的$this变量,
这个变量表示的是对象本身的引用,它的作用就是完成对象内部成员之间的访问。
另外访问对象成员有时还可以实用“::"符号,使用该符号一般来说可以在以下情况下出现:
1.parent::父类成员---调用父类的成员变量常量的方法
2.self::自身成员---调用当前类的静态成员和常量
3.类名::成员 ---访问类的变量常量
在上面的例子里面我们加一个const变量和一个方法:
const COUNTRY = 'China';
public function getCountry() {
echo self::COUNTRY;
echo "<br/>";
echo $this->COUNTRY;
echo "<br/>";
}
$obj = new student();
$obj->getCountry();
输出:
China
Notice: Undefined property: student::$COUNTRY in E:\PHP\PHP_Class\PHP_Class.php on line 37
可见在类中访问const常量应该通过self来访问。
静态方法和属性
在php中,通过static关键字来修饰的成员属性和方法称为静态方法或者静态属性。它的特性就是可以在不实例化类的情况下直接使用。
静态方法和静态属性也被称为类方法,类属性。它与对象的属性的区别就是静态方法或者静态属性是属于类的,而不是被限定在任何一个特定的对象实例。
在类外部可以通过类名::静态属性名/静态方法名的形式来使用,在类内部可以通过self::静态方法名/静态属性名使用。
示例代码如下:
class staticClass {
static $staticVal = 0;
public $val = 0;
static function getStaticVal() {
echo self::$staticVal;
echo "<br/>";
}
static function setStaticVal($param) {
self::$staticVal = $param;
echo self::getStaticVal();
echo "<br/>";
}
function change($param) {
$this->setStaticVal($param);
}
}
staticClass::getStaticVal();
staticClass::setStaticVal(100);
$obj = new staticClass();
$obj->change(1000);
-->
0
100
1000