面向对象
说明:面向对象是一种编程思想,对于小白来说,瞬间掌握,难度很大,需要体会和实践,慢慢领悟,为了防止陷入思想的无底洞,先不用管为什么这么写,前期我们需要先熟悉语法和用法,随着代码量的增多,理解自然会深化.前期一定要先做到以下几点:
类声明语法 试声明student类,有score属性和study方法
权限封装 知道public、 protected、 private各自的可见范围
继承 写A类,再写B类继承自A类,且要重写A类中的某个方法
静态属性与静态方法,知道static静态方法需要用类名::方法名()调用
魔术方法 了解常用魔术方法分别在什么时间被调用
第一个类(试说明函数与对象的区别)
// function fly() {
// echo "I can fly";
// }
如何改成类? 如下:
class 类名{
}
class是固定写法,后面加类名(类名才用大驼峰)后面直接跟大括号
然后把写的函数复制进去.一个类就写完了
class FirstClass
{
public $name = '小明';
function fly() {
echo "I can fly";
}
}
但发现调用的时候报错了.说找不到函数
注意类是需要先new,后调用
$first = new FirstClass();
var_dump($first);//查看返回的类型是什么?
此时注意:返回值是一个对象
调用fly函数后面要
$first -> fly();//调用类中的方法
类的属性和方法
属性(变量):姓名 年龄 性别 身高
方法(函数):苦,笑,走,跑,生气
类:说白了就是整个一个大类,通过属性(变量/名词)和方法(函数/动作),模拟人或者物(对象)的共同特点
$name = '小明';//这是原来的变量声明
class FirstClass
{
public $name = '小明';//放在类里面就成了类的属性
//不写public报错,因为我们写的不全,类有类的权限控制,需要写public
function fly() {
echo "I can fly";
}
}
说明:php5以后,方法默认不加public也可以调用和执行,默认就是public,之前的版本必须要加public
类的语法
类名,不区分大小写 习惯上市大驼峰
属性名 调用时不加$
函数名
$name = $first -> name;
$first -> fly();
类与对象的关系
类是"大量的,同类事物的共同特点的抽象描述"
而对象,是以上面类作为模版(模子),形成的一个具体实例
工厂里面造汽车的,汽车是由不同的零件做起来的,汽车就是这个类(整个大类)
对象就是成型的不同的汽车.
属性就是:发动机啊,方向盘,轮胎啊
方法就是:跑啊
this是谁?
<?php
class Person
{
public $name = '隔壁大老李';
public function learnPHP()
{
//伪变量(假变量,替代品,代表谁在说话)
echo $this->name . "is learning PHP!";
}
}
$laoli = new Person(); //$this谁调用就是谁.谁实例化就是谁
$name = $laoli->name;
echo "$name";
$laoli->learnPHP();
构造方法和析构方法
构造方法:__construct()
php自带的类方法,是指在new对象时,自动触发的方法
就像婴儿刚出生就会哭,不用叫,也不用调用
利用此方法可以完成一些初始化工作.
<?php
class Baby {
function __construct() {
echo "5555555~~~~~~~";
}
}
$baby = new Baby();
析构方法:__destruct()
在对象销毁时,自动触发
public function __destruct(){
echo 'die';
}
类的继承
继承的好处 :
子类可以继承父类的属性及方法 , 并允许覆盖父类的方法或新增方法.
通过自然界的比喻就是,通过"进化"来获得新特性, 同时不影响旧物种.
class A
{
}
class B extends A
{
}
三种权限控制(修饰符)
public(公有的) | protected(受保护的) | private(私有的) | |
---|---|---|---|
外部 | Y | N | N |
子类中 | Y | Y | N |
本类中 | Y | Y | Y |
class GrandFather
{
public $money = 3000000;
public function par()
{
echo $this->money, '<br>';
}
}
class Father extends GrandFather
{
public function sub()
{
echo $this->money, '<br>';
}
}
$wo = new Father();
$wo->par(); //父类可以调用,
$wo->sub(); //自己的也可以用
echo "$wo->money"; //继承类无法调用
方法重写
final public function myFunc() {
echo "看你还能不能重写!";
}
public function myFunc() {
echo '我把你重写了,就不给你钱';
}
类的封装性
封装 : 即禁止某些方法/属性 , 不充许外部调用 .
并开放部分方法 , 来间接调用 .
比如 银行的 ATM, 你可以输入密码 " 检测 " 自己的密码是否正确 ,
但不能 " 查询 " 自己的密码
class ATM
{
protected $money = 50000;
protected $pass = 666;
protected function getPass()
{
return $this->$this->pass;
}
public function verifyPass($pswd)
{
return $pswd == $this->pass;
}
public function checkOutMoney()
{
return $this->money;
}
}
$atm = new ATM();
$myPass = 666;
$res = $atm->verifyPass($myPass);
var_dump($res);
$atm -> getPass();
封装MySql类
class MySql
{
public $link;
public function __construct()
{
$this->con();
}
protected $cfg = array(
'host' => '127.0.0.1',
'user' => 'root',
'pwd' => '',
'db' => 'phpblog',
'charset' => 'utf8',
);
public function con()
{
$this->link = mysqli_connect($this->cfg['host'], $this->cfg['user'], $this->cfg['pwd'], $this->cfg['db']);
if (mysqli_connect_errno($this->link)) {
echo "连接 MySQL 失败: " . mysqli_connect_error();
} else {
echo "连接 MySQL 成功";
mysqli_query($this->link, 'set names ' . $this->cfg['charset']);
}
}
}
$mysql = new MySql();
还不快抢沙发