前端小白之每天学习记录----php(6)面向对象
php面向对象
类:
一类共性事物的抽象
比如:
eg:车子
共性:类的共性
eg:轮子、能动
对象:
类造出来的
eg:自行车, 滑板车, 小汽车, 卡车,
对象才是具体的产品,才能使用功能
1.php新建一个类,并实例化(实例化指的是用类新造一个对象):
定义方法:class 类名称 {}
public: 属性修饰符: 用来控制 属性/方法 的访问权限
实例化对象:对象名 = new 类名();
<?php
/*
定义一个类
class 类名称 {
}
类是由n个属性和方法组成的
eg:定义一个类:电脑
*/
class Computer {
//public: 属性修饰符: 用来控制 属性/方法 的访问权限
public $cpu = 'i5四核';
public $memory = '88G';
public function surf(){
echo '上网';
}
public function play(){
echo '播放电影';
}
public function program(){
echo '编程';
}
}
//实例化对象:对象名 = new 类名();
$c = new Computer();
//调用类的方法: 对象->方法名
$c->play(); //播放影片
echo '<br/>';
//读取对象的属性 对象->属性名[注意, 属性前面不需要美元符号]
echo $c->cpu; //i5四核
?>
2.属性修饰符与this
常见的属性修饰符用3个:
public( 公共的 )
protected: 受保护的
private: 私有的( 继承里面讲 )
this:
哪个对象调用我,我就指向谁
//Object.defineProperty
class Computer {
//public: 属性修饰符: 用来控制 属性/方法 的访问权限
/*
常见的属性修饰符用3个:
public( 公共的 )
protected: 受保护的( 继承里面讲 )
private: 私有的
*/
//类的外面: 类的定义中 {} 的外面
//类的里面: 类的定义中 {} 的里面
public $keyboard = '键盘'; //public: 在类的外面 和 类的里面 都能够访问
public $mouse = '鼠标';
private $cpu = '4核i5'; //private: 只能在类的内部才能访问
public function showInfo(){
//this: 哪个对象调用我,我就指向谁
echo $this->cpu . '--' . $this->mouse . '---' . $this->keyboard;
}
}
$c = new Computer();
$c->showInfo();//
// echo $c->cpu; //报错, 在类的外面 不能访问私有的属性
// echo $c->keyboard;
// echo $c->mouse;
3.构造函数
<?php
/*
构造函数:
1, 定义的时候, 他的函数名: __construct
2,php4 构造函数名是跟类同名
3, 构造函数 不需要手动去调用, 自动被调用
当对象实例化的时候, 构造函数会被自动调用
*/
class Person{
public $name;
public $sex;
public function __construct( $n, $s ){
echo '我会自动调用';
$this->name = $n;
$this->sex = $s;
}
}
$p = new Person( 'zhangsan', 'man' );//自动调用
$p2 = new Person( 'lisi', 'man' );
?>
4.继承
<meta charset="UTF-8">
<?php
class Person {
public $name;
public $age;
public function __construct( $n, $a ){
$this->name = $n;
$this->age = $a;
}
public function speak(){
echo '说话<br/>';
}
protected function eat(){
echo '吃饭<br/>';
}
private function waimao (){
echo '长相<br/>';
}
}
//class 类名 extends 父类名
/*
继承 到底 继承了什么?
1,父类所有的public的属性和方法
2, 父类所有的protected的属性和方法
3, private的属性和方法 不会继承过来
public: 类内,类外,子类 可以访问
protected: 类内,子类 可以访问
private: 类内 可以访问
*/
class Student extends Person{
//增加内容
public $No;
//扩展构造函数
public function __construct( $n, $a, $no ){
//parent:父类
parent::__construct( $n, $a ); //调用父类的构造函数
$this->No = $no;//构造函数新扩展的内容
}
//重写构造函数
// public function __construct( $n, $a, $no ){
// $this->name = $n;
// $this->age = $a;
// $this->No = $no;
// }
//如果 不满意父类的方法,可以重写(覆盖继承过来的方法)
public function speak(){
echo '我说的是 学生话<br/>';
}
//父类没有的方法, 可以增加
public function test(){
echo '我的学号是:' . $this->No . ' 学生要考试<br/>';
$this->eat(); //protected的方法 能够被子类继承, 但是不能在类的外部访问
// $this->waimao(); //private修饰的方法/属性 不能被继承
}
}
$p = new Person( '小强', 20 );
$p->speak();
$stu = new Student('大强', 22, '2342343' );
$stu->speak();
$stu->test();
// $stu->eat();//报错 protected的方法 能够被子类继承, 但是不能在类的外部访问
// $stu->waimao();//报错 private修饰的方法/属性 不能被继承 更不能在类外访问
?>
5.用类封装(数据库连接,数据库curd操作)
在封装前先了解一下需要用到的php的array知识
array1:[ ] :空索引(当索引为空时,默认为该数组原最大索引加1)
<?php
$user = array();
// $user[0] = 'zhangsan';
// $user[2] = 'zhangsan';
// //[] 是在该数组 最大的数字索引上+1
// $user[] = 'zhangsan';
// $user[8] = 'zhangsan';
// $user[] = 'zhangsan';
$user[] = '张三';
$user[] = 'lisi';
$user[] = 'wangwu';
// print_r( $user );//Array ( [0] => 张三 [1] => lisi [2] => wangwu )
// echo $user;
?>
array2:array_values与array_values与implode
1.数组名_values:把数组的值取出来保存在一个数组里面然后返回
2.数组名_keys:把数组的键取出来保存在一个数组里面然后返回
3.implode:把数组中的所有元素放入一个字符串。(相当于js的join)
<?php
$user = array(
'title' => '星星',
'content' => '小星星',
'age' => 22
);
// print_r( array_keys( $user ) );//
// $keys = array_keys( $user );
//implode--->join
// echo implode( ",", $keys );
$values = array_values( $user );
print_r($user);
echo "</br>";
print_r( $values );
// echo implode( "','", $values ); //星星,小星星,22
?>
array3:foreach用来遍历array,count($array)用来获取array的长度(键值对的数量)
foreach用法:foreach(遍历对象 as 键 => 值 ){每次遍历执行的函数}
<meta charset="UTF-8">
<?php
$userList = array(
0 => array(
'张三',
'李四',
),
1 => array(
'小星星',
'小强强'
)
);
// foreach( $userList as $k => $v ){
// echo $k . '--->' . $v[0] . '--->' . $v[1] . '<br/>';
// }
foreach( $userList as $key => $val ){
// echo $k . '--->';
echo $key;
foreach( $val as $k2 => $v2 ){
echo '---->' . $v2;
}
echo '<br/>';
}
// $arr = array(
// 0 => 1,
// 3 => 10,
// 5 => 100,
// );
// foreach( $arr as $key => $val ){
// foreach( $arr as $k => $v ){
// echo $key . '-->' . $val . '<br/>';
// echo $val . '<br/>';
// echo $v . '<br/>';
// }
// foreach( $arr as $val ){
// echo $val . '<br/>';
// }
// echo count($arr); //3
//$i---> 0, 1, 2
//for循环的缺点:不能遍历 不连续的数字索引 和 字符串索引
// for( $i = 0; $i < count( $arr ); $i++ ){
// $arr[0] $arr[1] $arr[2]
// echo $arr[$i] . '<br/>';
// }
?>
封装数据库连接,数据库curd操作(新建mysql.class.php)
测试时需要新建数据库sxlxb,表message,列名(msg_id,title,content)
<meta charset="UTF-8">
<?php
class Mysql {
private $host; //主机名
private $dbName; //数据库名称
private $userName; //用户名
private $userPWd; //密码
public function __construct( $_host, $_dbName, $_userName, $_userPwd ){
$this->host = $_host;
$this->dbName = $_dbName;
$this->userName = $_userName;
$this->userPwd = $_userPwd;
if( !$this->connect() ){
die( mysql_error() );
}
// else{echo "connect is ok";}//测试数据库是否连接成功
//设置编码
$this->setCode();
//选择数据库
$this->selectDb();
}
public function connect(){
return mysql_connect( $this->host, $this->userName, $this->userPwd );
}
public function setCode(){
$this->query( "set names utf8" );
}
public function selectDb(){
mysql_select_db( $this->dbName );
}
public function query( $sql ){ //执行语句
return mysql_query( $sql );
}
//用来查询所有的数据
public function getAll( $sql ){
$res = $this->query( $sql );//返回资源
$list = array();
while( $row = mysql_fetch_assoc( $res ) ){//遍历出每一行资源
// array_push( $list, $row );
$list[] = $row;
}
return $list;
}
//查询一行数据
public function getRow( $sql ){
$res = $this->query( $sql );
return mysql_fetch_assoc( $res );
}
//查询某一列的个数
public function getCol( $sql ){
$res = $this->query( $sql );
$row = mysql_fetch_row( $res );
return $row[0];
}
//插入
// INSERT INTO message( title, content ) VALUES ( '星星', '小星星' );
// 产品经理 ----> 痛点
/*
add( array(
'title' => '星星',
'content' => '小星星'
), 'message' );
*/
public function add( $data, $tbName ){
$sql = "INSERT INTO {$tbName}("; //insert into message (
$sql .= implode( ',', array_keys( $data ) ) . " ) VALUES ( '";
$sql .= implode( "','", array_values( $data ) ) . "')";
// echo $sql;
return $this->query( $sql );
}
// UPDATE message SET title = 'hello', content = '你好' WHERE msg_id = 1
public function update( $data, $tbName, $condition ){
$sql = "UPDATE {$tbName} SET ";
foreach( $data as $k => $v ){
$sql .= $k . ' = ' . "'$v',";
}
// UPDATE message SET title = 'hello', content = '你好',
$sql = substr( $sql, 0, -1 );
$sql .= " " . $condition;
return $this->query( $sql );
}
}
$mysql = new Mysql( "localhost", "sxlxb", "root", "root" );
// $list = $mysql->getAll( "SELECT * FROM message" );
// $list = $mysql->getAll( "SELECT title FROM message" );
// print_r( $list );
// $msgDetail = $mysql->getRow( "SELECT * FROM message WHERE msg_id = 2" );
// print_r( $msgDetail );
// $total = $mysql->getCol( " SELECT COUNT(msg_id) as total FROM message;" );
// echo $total;
// $res = $mysql->add( array(
// 'title' => '简化的插入',
// 'content' => '现在插入数据非常舒服'
// ), 'message');
// $res = $mysql->update( array(
// 'title' => '简化的修改',
// 'content' => '现在修改数据非常舒服'
// ), 'message', 'WHERE user_id = 8' );
// echo $res
// echo ( $res !== false ) ? 'update is ok' : 'error';
?>

浙公网安备 33010602011771号