php中的类
1.在php的类定义中。成员属性前面加 var,表示该成员变量不需要特殊的意义,如需要特殊的意义可以加 static public private 等关键字。
2.类的构造函数的声明方式可以是
function __construct(){} 或者是 与类名相同的函数 function className(){} 这种是php5之前的版本,现在可以使用,但是不推荐。
3.类的析构函数声明
function __destruct(){} 析构函数不能带参数。
4.类中的四个魔术函数 __set() __get() __isset() __unset()
既然是面向对象的,那么就要具有封装性,即尽可能将类中的属性定义为私有的只允许,类内部访问,拒绝外部直接访问,但是这样一来,就是失去了灵活性,在程序中有时需要更改属性的值,却毫无办法。也许,你会说可以再类中再添加一些函数专门用来设置私有属性的值和获取私有属性值。但是一旦这个类中属性特别的多,而每个属性至少要写两个函数来设置和获取属性的值,将会使得类中的代码过于冗余。同时加大写代码的劳动量。因此php中就预定了几个方法,称为魔术方法。它们主要是来解决属性私有封装后所带来的不灵活的问题。通过这四个魔术方法来,开放属性的访问,有一个好处就是,便于集中控制,避免对属性的非法操作和敏感数据泄露。
void __set($name,$value):设置类中的成员属性,输入成员属性名,以及要设置的值,在对象对成员属性赋值的时候会自动调用。所以在类中定义时,我们可以做一些限制和防范。
mixed __get($name):获得类类中的成员属性值,输入成员属性名,在对象调用成员时,自动调用。
bool __isset($name):类中是否有某变量,在对象调用isset()函数检查是否已经声明了某变量时,自动调用
void __unset($name): 删除类中的某个变量,在对象调用unset()函数删除自身的某个变量时自动调用。
class Person
{
public $name;
protected $age;
private $pwd;
function __construct($name,$age,$pwd)
{
$this->age=$age;
$this->name=$name;
$this->pwd=$pwd;
}
public function __set($name,$value)
{
if($name=='name'||$name=='pwd') return ;//不允许修改姓名和密码
$this->$name=$value;
}
public function __get($name)
{
if($name=='pwd') return'保密'; //不允许读取敏感数据 密码。
return $this->$name;
}
public function __isset($name)
{
return isset($this->$name);
}
public function __unset($name)
{
unset($this->$name);
}
public function say()
{
echo '本人名叫'.$this->name.' 今年年芳'.$this->age.' 密码是'.$this->pwd.'<br />';
}
}
$per=new Person('张三','24','12345');
$per->name="李四";
$per->age=55;
$per->say();
echo '密码:'.$per->pwd.'<br/>';
print_r('unset前的年龄:'.$per->age.'<br />');
unset($per->age);
echo '对象per是否还有属性age:';
var_dump(isset($per->age));
运行结果:
从结果来看,有几个点需要注意,第一这四个魔术方法只对类的私有属性起作用,同时魔术方法必须用public修饰,不能用private或者是protected修饰。但是我们一般不直接自己调用这些方法,而是给php自己去调用的。
注意这四个魔术方法,都只是对类中的私有或者是受保护的(即外部不能直接访问类中的)属性进行相关的操作,对于公有属性无效,因为公有可以直接访问。
同时这四个魔术方法,不需要人为的调用,php系统在访问私有属性时,会自动调用。如:
$per->age=55 会自动调用 Person类中的 __set()
echo $per->age; 会自动调用 Person类中的 __get()
isset($per->age) 会自动调用 Person类中的 __isset()
unset($per->age) 会自动调用 Person类中的 __unset()
5.类中访问类型
private 私有的 只允许在同一个类成分访问
protected 受保护的 只允许在同一个类或者是继承该类的子类中的成分访问。
public 公有的 没有限制访问。
注意类成员要是没有 访问类型 或者是加 var 就是默认为public
6.php中类之间的继承,是单一继承与java相同。通过关键字 extends 继承父类。子类在函数中可以通过parent::调用父类中函数。
7.关键字
final 可以用于类和成员方法。用于类,则该类不能再被扩展和继承。用于成员方法则该方法不能被子类覆盖。
static 可以用来标记成员变量和成员方法,static标记的成员表示类所有,所有对象共享。在类内部可以通过self:: 在类外部可以用className:: 的方法调用类中的静态成员。静态成员不能访问非静态成
const 在类中定义常量不能通过define(),必须通过 const 定义,而且类的成员属性不用 带$符号,一般为大写。也只能通过self::或者className::来调用。instanceof 判断一个对象是否是类的实例。
8.克隆:在php中对象之间的赋值,是引用传递。有时候需要创建一个新的副本。可以使用clone,克隆一个一模一样的副本。
如果需要对克隆的副本进行某些操作,可以在类中定义一个__clone函数在使用clone关键字时,会自动被调用。
9.类中通用的方法
__toString() 当将对象当做字符串使用时会自动调用,这个函数一般返回一些关于该对象的信息的字符串。
__call() 当尝试调用对象中不存在的方法,是会出现错误,中断程序的问题,在php中出现这一情况时,会自动调用 __call()函数进行处理,我们可以在可以在类中定义__call()函数删除自身的某个变量时自动调用。进行相关的处理。
__autoload() 全局函数,用来自动加载同目录下的包含类的文件。
__serialize() 对象串行化。
10.抽象类:抽象类中可以有成员属性和方法,也可以没有抽象方法。有抽象方法的类一定是抽象类但是抽象类不一定有抽象方法。不能实例化。抽象类中的属性和普通方法和被赋值或者是实现,但是抽象方法不能被实现,所以抽象类是个半成品不能实例化,只能通过子类的继承来实现实例化,抽象类本身的作用就是为子类定义一个规范或者说是一个模板。
abstract class className{
}
11.接口:一个类可以实现多个接口,一个接口中成员属性只能是常量,成员方法只能是抽象方法,不需要加static 接口中默认为抽象方法 ,不需要加public 默认权限为public。不能实例化只能是被接口继承或者是被子类实现。与抽象类相比,接口是一个更加严格的规范或者说是模板。
interface interfaceName{
}