本篇主要记录类的创建,下面是创建类,声明变量,方法的基本形式
注意
$this 对象内部方法中代表本对象的一个引用,但只能在对象的成员方法中使用,不管是在对象内部使用$this访问自己对象内部成员,还是在对象外部通过对象的引用名称访问对象中的成员,都需要使用特殊的运算符“->”来完成访问。
class BoyFriend{
//声明变量(成员属性)
var $name ;//基本不使用var
var $age;
var $sex;
var $height;
//成员方法
public function fuck(){
echo $this -> name."fuckU";
}
}
类的初始化
//两种形式都可以
$bf1 = new BoyFriend();
$bf2= new BoyFriend;
//赋值
$bf1 -> name = "jack";
$bf1.name 此种形式虽然能显示出来,但是是错误的,因为此处的.是连接,而不是类似于OC的点语法
构造函数
1.是对象创建完成以后,第一个自动调用的方法
2.方法名比较特殊,可以和类名相同名的方法名
3.给对象中的成员赋值
4.构造方法的魔术方法__construct;相当于OC的便利构造器
// function __construct()与下面等同,目前主要用此形式
function BoyFriend($name,$age,$sex){
$this->name = $name;
$this->age = $age;
$this->sex = $sex;
echo $this->name.$this->age.$this->sex.'
';
}
//初始化并赋值
$bf1 = new BoyFriend("wp",23,"男");
$bf2 = new BoyFriend("sb",30,"女");
析构函数
类似于OC中的dealloc,但原理机制不同,和Java垃圾回收差不多,PHP的垃圾回收,但并不常用
__destruct 对象回收之前自动调用,析构函数没有参数,无返回值
function __destruct(){
echo "###{$this->name}再见!
";//此处先释放bf2,再释放bf1,栈先进后出
}
封装
在属性或方法前添加修饰词private、public、protect等,下面着重强调访问私有变量的一些方法。
当成员变量为私有时,不可直接访问
class BoyFriend{
//声明变量(成员属性)
private $name ;
private $age;
private $sex;
//私有变量赋值
function setSex($sex){
//对象本身还是可以获取自己的变量;
$this -> sex = $sex;
}
function setAge($age){
$this -> age = $age;
}
//私有对象取值
function getAge(){
//通过判断这一过程,重新赋值
if ($this->age<20) {
return $this->age;
}else{
return "whatTheHell";
}
}
//getSex 与上类似不写了
//在构造函数中使用set方法赋值
function __construct($name,$age,$sex){
$this -> sex = $this->setSex($sex);
$this -> age = $this->setAge($age);
}
}
//获取值
$bf1 = new BoyFriend("wp",28,"男");
echo $bf1 -> getAge();
echo $bf1 -> getSex();
其实这一部分就相当于OC中的setter、getter方法,接下来是两个相关的魔术方法,会大大缩减所需写的方法
魔术方法
__get();
自动调用:是在直接访问私有成员时,自动调用
class BoyFriend{
private $age;
private $sex;
function __get($pro){
//自动调用私有属性,传进来私有属性名称
return $this->$pro.'
';
}
}
//直接读取私有属性会自动调用__get()
echo $bf1->sex.'
';
echo $bf2->age.'
';
__set();
自动调用,是在设置属性值时自动调用, 赋值时自动获取私有变量名称及值
class BoyFriend{
private $age;
private $sex;
function __set($name,$value){
echo "{$name}=={$value}
";
$this->$name = $value;
}
}
$bf1->age = 111;
$bf1->sex = "非洲人";
接下来两个魔术函数,并不常用,了解即可
isset()判断变量是否存在,unset()消除某个变量,这在变量是非私有性质的时候是可以的,但是当变量是私有的时候,需要用到__isset()和__unset()结合使用才能访问私有变量。
class BoyFriend{
//变量(成员属性)
private $name ;
private $age;
private $sex;
function __construct($name,$age,$sex){
$this->name = $name;
$this->age = $age;
$this->sex = $sex;
}
//在isset()判断私有变量时,自动调用__isset();同时获取私有变量名称
function __isset($proname){
echo $proname.'
';
// return isset($this->$proname);
}
function __unset($proname){
echo $proname.'
';
if ($proname!="age") {
unset($this->$proname);
}
}
}
$bf1 = new BoyFriend("wp",28,"男");
if (isset($bf1->name)) {
echo "存在name";
}else{
echo "不存在";
}
//删除
unset($bf1->name);
__toString
1.是在直接使用echo print printf输出一个对象引用时,自动调用这个方法
2.将对象的基本信息放在__toString()方法内部,形成字符串返回。
3.__toString()方法中,不能有参数,而且必须返回一个字符串
克隆对象
1.使用clone这个关键字 复制了一个对象
$p = new Person();
$p1 = clone $p ;
__clone()魔术方法
1.是在克隆对象时,自动调用的方法
2.作用:和构造方法一样,是对新克隆的对象初始化
3.在这个方法中$this代表的是副本,所以可以给所有副本的成员初始化
function__clone(){
$this->name = "123";
$this->age = 9;
}
__call()
1.就是在调用一个对象中不存在的方法时,自动调用的方法
2.有两个参数,第一个参数是,调用不存在的方法名,第二个是参数
3.可以写提示,但不是主要功能。将方法的功能相似,但方法名还要不同的,可以采取这个方式