类与对象基础
一、类的声明与实例化
<?php
//类的声明与实例化
//1.类的声明
class Demo1{
//类成员:类属性,类常量,类方法
public $name = '王佳祥';
//类的实例构造方法/器
public function __construct()
{
}
}
//2.类的实例化:就是创建对象的过程
//类中的构造方法必须用:new 来调用
$demo = new Demo1();
var_dump($demo);
//实例与对象,在不引起误会的场景下,可以通用
echo '<hr>';
//动态类,将类名称放到一个变量中
$className = 'Demo1';
$obj = new $className;
echo get_class($obj);
二、类的属性和方法
<?php
//类中成员:类属性,类方法
class Demo2{
//类的属性
//公共成员:在类的内部和外部都可以访问,都可见
public $name = '闷油瓶';
public $options = ['七星鲁王','怒海潜沙','云顶天宫'];
//heredoc,nowdoc都支持
public $table = <<<HEREDOC
<table border="1" cellspacing="0" cellpadding="10px">
<tr>
<td>id</td>
<td>name</td>
<td>age</td>
</tr>
<tr>
<td>1001</td>
<td>张起灵</td>
<td>100</td>
</tr>
<tr>
<td>1002</td>
<td>吴邪</td>
<td>30</td>
</tr>
</table>
HEREDOC;
//静态属性:如果这个属性仅使用一次,可以不创建类实例,而直接通过类来调用
public static $color = '红色';
//抽象属性,没有被初始化的属性,默认为null
public $sex;
}
//类的实例化
$demo2 = new Demo2;
//类中的成员属性的访问
echo $demo2->name;
echo $demo2->table;
//访问静态成员使用双冒号:范围解析符
echo Demo2::$color;
var_dump($demo2->sex);
<?php
//类中的方法
class Demo3
{
//类属性 public :访问限定符,用来声明类成员的作用域
public $name = '吴邪';
public $age = 30;
public static $color = 'red';
//类方法
public function write1(){
//访问类属性
$user = new Demo3;
//访问类成员
return "姓名:{$user->name},年龄:{$user->age}";
}
public function write2(){
//声明一个变量,声明在方法中的变量,不是属性,是私有变量/局部变量
$sex = '男';
//访问类属性 self:类引用
//$user = new self; $this 会自动创建,$this是只读的,不能被更新
//访问类成员 $this:类实例引用
return "姓名:{$this->name},年龄:{$this->age}";
}
//类方法中访问类外部成员:变量函数
public function write3()
{
//调用外部函数
$str = hello();
//外部变量
return $str . $GLOBALS['username'];
}
//实际项目中,外部成员应该通过方法参数注入到方法,而不是在方法中直接调用
public function write4(Closure $hello,string $username)
{
return $hello() . $username;
}
//静态方法:不依赖类实例,可以用类直接调用
public static function write5()
{
//静态成员属于类,不属于类实例,所以不能使用类实例的引用$this
return "颜色:" . self::$color;
}
}
//客户端代码
$user = new Demo3;
echo $user->write1().'<br>';
echo $user->write2().'<br>';
//外部函数
function hello(){
return 'hello';
}
$hello = function()
{
return 'Hello';
};
$username = '张起灵';
echo $user->write3().'<br>';
echo $user->write4($hello,$username).'<br>';
echo $user->write5().'<br>';
三、类的访问与扩展
- 访问操作符,public(公共的),private(私有的),protected(受保护的)
<?php
//类成员的访问控制
class Demo4
{
//public:公共成员,默认值,新版本不能省略
public $name = '王胖子';
//private:私有成员,只能在本类中使用
private $age = 40;
//protected:受保护的,只可以在子类和本类中使用,外部不能用
protected $job = '卖古玩';
public function write()
{
return "姓名:{$this->name},年龄:{$this->age},工作:{$this->job}";
}
}
//子类
class Demo4_1 extends Demo4
{
public function write()
{
return "姓名:{$this->name},年龄:{$this->age},工作:{$this->job}";
}
}
//类外部
$user = new Demo4;
echo $user -> name;
echo '<hr>';
echo $user->write();
echo '<hr>';
//调用子类访问
echo (new Demo4_1)->write();
<?php
//类的继承/扩展
//变量就是数据复用,函数是代码复用,继承就是类的复用
//final:类前加禁止类扩展
class Demo5
{
//属性
protected $name = '黑瞎子';
//方法
// final:方法禁止重写
public function write()
{
return "姓名:{$this->name}";
}
}
//扩展类
class Rob extends Demo5
{
//1.扩展
//属性扩展
protected $age = 40;
//方法扩展
public function write()
{
return parent::write() . ",年龄:{$this->age}";
//return "姓名:{$this->name},年龄:{$this->age}";
}
}
$rob = new Rob;
echo $rob->write();
四、学习总结
1.类用class来声明,class 类名(){…}
2.用new来实例化类,new 类名
3.类的属性:静态属性(用static来声明)抽象属性(没有初始化的属性)
4.访问静态成员用双冒号
5.类的访问操作符public(公共的)private(私有的)protected(受保护的)
6.private只能在本类中访问,protected只能在子类和本类中访问
7.类的扩展用extends继承父类,属性扩展更新父类中已有的值,方法扩展在原有的方法中添加数据
8.final:可以禁止方法或者属性的扩展,也可以禁止整个类的扩展