前端小白之每天学习记录----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'; ?>