一、 对象和类:
类与对象的关系就如模具和铸件的关系,类的实力化的结果就是对象,而对对象的抽象就是类,类描述了一组有相同特性(属性)和相同行为的对象。
1. class person{ }//这个是类
2. $obj = new person();//类的实例化就是对象
1、类和对象的简单使用
Class Father {
public $name; // 这是属性
// 这是方法
public function work() {
echo '<h2>努力工作</h2>';
}
}
$f = new father(); // new 实例对象
echo $f->name;
$f->work();
2、$this的使用
指的是当前对象的意思,在类的内部使用。
class Father{
public $name;
public function setName($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
}
$father= new Father();
$father->setName("张三");
$name = $test->getName();
echo $name; // 张三
二、继承
1、简单使用
Class Father {
public $name; // 这是属性
// 这是方法
public function work() {
echo '<h2>努力工作</h2>';
}
}
/**
* 子类继承父类
*/
Class Son extends Father {
}
$ming = new Son(); // new 子类的实例对象
echo $ming->name; //
$ming->work(); // 努力工作
2、重写
Class Father {
// 属性
public $name;
/**
* 父类中方法
*/
public function work() {
echo '<h2>努力工作</h2>';
}
/**
* 重写的时候权限只能放大不能缩小
* 在子集是可以的
*/
public function jump() {
echo '<h2>能跳3米</h2>';
}
}
/**
* 子类继承父类
*/
Class Son extends Father {
/**work
* 重写父类方法
*/
public function jump() {
echo '<h2>能跳5米</h2>';
}// 改写父类
public function work() {
parent::work(); //在父类基础上添加
echo '<h2>还要谈恋爱</h2>';
}
}
$f = new father();
$f->work(); // 努力工作
$f->jump(); // 能跳3米
//子类的实例对象
$ming = new Son();
$ming->work(); //"努力工作/n 还要谈恋爱"
$ming->jump(); //"能跳5米"
三、修饰符
1523868465(1).jpgpublic:默认值,表示全局的,类内部外部子类都可以访问。
protected:表示受保护的,只有本类或子类或父类中可以访问,不允许外部调用。
private:表示私有的,只有本类内部可以使用。
<?php
/**
* 父类
*/
Class Father {
// 属性
public $name;
protected $age;
private $height;
}
/**
* 子类继承父类
*/
Class Son extends Father {
/**
* 完全输出
*/
public function sonOut() {
echo '<h2>'.$this->name.' </h2>';// 父亲
echo '<h2>'.$this->age.' </h2>'; // 49
// echo '<h2>'.$this->height.' </h2>'; // 报错
}
}
$f = new father();
echo $f->name.'<br />'; // “父亲”
//echo $f->age.'<br />'; // 报错
//echo $f->height.'<br />';// 报错
$ming = new Son();
$ming->sonOut();
Static:
(1)静态的属性;
(2)用static修饰的成员属性可以被同一个类的所有对象共享;
(3)静态的数据是在类第一次被加载的时候就存在了内存中的数据段中(初始化静态段);
(4)类中使用self::成员属性名;
(5)类外 类名::成员属性名;
Const:
(1)类中常量属性,在类中声明常量必须使用const;
(2)类中使用 self::成员属性名;
(3)类外使用 类名::成员属性名;
注意:属性中的变量可以初始化,但是初始化的值必须是常数
(这里的常数是指php脚本在编译阶段时就为常数,而不是在编译阶段之后在运行阶
段运算出的常数。例如,不能包含任何运算符,不能是任何变量,不能是一个函数等)。
成员属性的调用方式:
在类的成员方法里面,可以通过 $this->property(property是属性名字)这种方式来访问类的属性、 方法。但是要访问类的静态属性或者在静态方法里面却不能使用,而是使用 self::$property。
在类的非静态方法里面可以使用伪变量 $this,这个伪变量是调用该方法的实例化对象引用。
Class Father {
static $like = '吃';
const SEX = '男';
/**
* 魔术方法
*/
public function __construct(){
echo self::$like; // 吃
echo self::SEX; // 男
// echo $this->like; //报错
// echo $this->SEX;//报错
}
}
四、魔法方法
1.__construct():构造函数,在实例化对象时被调用
2.__destruct():解析函数。(不常用)
3.__set():属性重载,在给不可访问属性赋值时,会被调用
4.__isset():属性重载,当对不可访问属性调用isset()时,会被调用,返回布尔值
5.__unset():属性重载,当对不可访问属性调用unset()时,会被调用
6.__clone():克隆
7.__toString():用于返回一个字符串。只有在直接使用于echo或print时才能生效
8.__autoload():自动加载类文件
9.__get():属性重载,在读取不可访问属性的值时,会被调用
10.__call():方法重载,在对象中调用一个不可访问方法时,__call会被调用
11.__autoload():没有引入文件时自动加载
12.__sleep():当对象串行化(serialize()串行化对象)那一瞬间会调用该方法。不能返回父类的私有成员名字。
13.__wakeup():在反序列化操作(unserialize()反序列化)那一瞬间会调用该方法。
注意:属性重载只能在对象中进行。在静态方法中,这些魔术方法不会被调用,所以这些方法不能被声明为static。
eg:
function __autoload($name){
include_once $name.".class.php";
}
$human = new Human();
echo $human->age."<br>";//18
class Student
{
public $name,$age;
function __construct($name,$age){
$this->name = $name;
$this->age = $age;
}
function __toString()
{
// TODO: Implement __toString() method.
return $this->name."今年".$this->age;
}
function __clone()
{
// TODO: Implement __clone() method.
}
//不存在函数时会调用该方法
function __call($name, $arguments)
{
// TODO: Implement __call() method.
echo $name."方法不存在"."<br>";
print_r($arguments);
echo "<br>";
}
function __isset($name)
{
// TODO: Implement __isset() method.
//echo "Is"." ".$name." "."set?";
return isset($this->data[$name]);
}
//当对象被串行化那一瞬间
function __sleep()
{
// TODO: Implement __sleep() method.
echo "我要睡着了";
return array("name","age");
}
//当字符串反序列化变回对象那一瞬间调用
function __wakeup()
{
// TODO: Implement __wakeup() method.
echo "<br>";
echo "我要醒了";
}
}
$stu = new Student("张三",18);
echo $stu."<br>"; //张三今年18
$stu2 = clone $stu;
$stu2->name = "李四";
echo $stu2."<br>"; //李四今年18
$stu2->show("王五",18); //show方法不存在 Array ( [0] => 王五 [1] => 18 )
var_dump(isset($stu2->num)); //bool(false)
echo "<br>";
//串行化对象
$str = serialize($stu); //此时调用sleep函数,输出我要睡着了
echo "<br>";
echo $str; //O:7:"Student":2:{s:4:"name";s:6:"张三";s:3:"age";i:18;}
//反序列化字符串
$strToArr = unserialize($str); //此时调用wakeup函数,输出我要醒了
echo "<br>";
echo $strToArr; //张三今年18
网友评论