PHP 笔记(二)
1. 面向对象
已经学过 C++面向对象、Java 面向对象,这一部分属于是复习,以及熟悉 PHP 面向对象的不同之处,所以不会详讲
1.1 基本使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| <?php class Car { function __construct($color) { $this->color = $color; }
function __destruct() { echo "<br>"; echo "系统自动执行析构函数"; }
function setColor($color) { $this->color = $color; }
function getColor() { return $this->color; } }
$car = new Car("White"); echo $car->getColor(); echo "<br>";
$car->setColor("Red"); echo $car->getColor();
?>
|
1.2 继承
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| <?php class Car { function getColor() { return "白色"; } }
class FCar extends Car { function getColor() { echo "红色"; }
function fly() { echo "I can Fly"; } }
$fcar = new FCar("White"); echo $fcar->getColor(); echo "<br>";
$fcar->fly();
?>
|
1.3 访问控制
只有属性的访问控制,方法的类似
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| <?php echo "<pre>"; class MyClass1 { public $public = "Public"; protected $protected = "Protected"; private $private = "Private";
function printM() { echo $this->public . "\n"; echo $this->protected . "\n"; echo $this->private . "\n"; } }
class MyClass2 extends MyClass1 { protected $protected = 'Protected2'; function printM() { echo $this->public . "\n"; echo $this->protected . "\n"; echo $this->private . "\n"; } }
$obj1 = new MyClass1(); echo $obj1->public . "\n"; $obj1->printM();
$obj2 = new MyClass2(); echo $obj2->public . "\n"; $obj2->printM(); ?>
|
1.4 接口
使用接口,可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容
接口通过interface关键字来定义,定义所有的方法都是空的
接口中定义的所有方法都必须是公有(public), 这是接口的特性
实现接口,使用implements操作符。类中必须实现接口中定义的所有方法,否则会报错。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <?php echo "<pre>"; interface myName { public function setName($name); public function getName(); }
class Name implements myName { public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } }
$n = new Name; $n->setName("CLZ"); echo $n->getName(); ?>
|
1.5 抽象类
任何一个类,如果至少有一个方法被声明为抽象的,则这个类就必须声明为抽象的
被定义为抽象的方法只是声明了它的调用方式,不能定义具体的功能实现。
继承一个抽象类的时候,子类必须定义父类中的抽象方法,这些方法的访问控制必须和父类一样或比父类宽松。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| <?php echo "<pre>"; abstract class AbstractClass { abstract protected function getValue(); abstract protected function prefixValue($prefix);
public function printOut() { print $this->getValue() . PHP_EOL; } }
class ConcreateClass1 extends AbstractClass { protected function getValue() { return "ConcreateClass1"; }
public function prefixValue($prefix) { return "{$prefix}ConcreateClass1"; } }
class ConcreateClass2 extends AbstractClass { public function getValue() { return "ConcreateClass2"; }
public function prefixValue($prefix) { return "{$prefix}ConcreateClass2"; } }
$class1 = new ConcreateClass1(); $class1->printOut(); echo $class1->prefixValue("FOO_") . PHP_EOL;
$class2 = new ConcreateClass2(); $class2->printOut(); echo $class2->prefixValue("FOO_") . PHP_EOL; ?>
|
1.6 静态方法
通过static 关键字声明类属性或方法,可以不是实例化类直接访问
静态属性不能由对象通过->操作符访问,而应该使用::操作符访问
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <?php echo "<pre>"; class Test { public static $my_static = "静态变量";
public function staticValue() { return self::$my_static; }
static function sayHello() { echo "Hello!" . PHP_EOL; } }
print Test::$my_static . PHP_EOL; Test::sayHello();
$test = new Test(); print $test::$my_static . PHP_EOL; print $test->staticValue() . PHP_EOL; ?>
|
1.7 调用父类的构造方法
在子类的构造方法中调用parent::__construct()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <?php echo "<pre>"; class Car { function __construct($color, $cost) { $this->color = $color; $this->cost = $cost; } }
class WCar extends Car{ function __construct($color, $cost, $weight) { parent::__construct($color, $cost); $this->weight = $weight; } }
$wcar = new WCar("White", 99999, "999kg"); var_dump($wcar); ?>
|
2. 表单
简单使用
form.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> </head>
<body> <form action="welcome.php" method="post"> 名字: <input type="text" name="fname" /> 年龄: <input type="text" name="age" /> <input type="submit" value="提交" /> </form> </body> </html>
|
welcome.php
1 2 3 4
| <?php echo "欢迎" . $_POST["fname"] . "<br>"; echo "你的年龄是 " . $_POST["age"] . "岁"; ?>
|
3. PHP AJAX
3.1 AJAX
AJAX 是一种无需重新加载整个页面的情况下,能够更新部分网页的技术。
AJAX 通过在后台与服务器进行少量数据交换,使网页实现异步更新。使用 AJAX 可以实现在不重载整个页面的情况下,对页面的某些部分进行更新。
3.2 使用 PHP、AJAX 实现简单的前后端交互
websites 表如下:
前端:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> </head>
<body> <form> <select name="users" onchange="showSite(this.value)"> <option value="">选择一个网站:</option> <option value="1">Google</option> <option value="2">淘宝</option> <option value="3">Facebook</option> </select> </form>
<div id="txtHint"></div> <script> const txtHint = document.getElementById("txtHint");
function showSite(str) { if (str == "") { txtHint.innerHTML = ""; return; }
let xmlhttp = new XMLHttpRequest(); xmlhttp.open("GET", "getsite.php?v=" + str, true); xmlhttp.send(null);
xmlhttp.onreadystatechange = function () { if (xmlhttp.readyState === 4 && xmlhttp.status === 200) { txtHint.innerHTML = xmlhttp.responseText; } }; } </script> </body> </html>
|
后端
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| <?php $v = $_GET['v'];
if(empty($v)) { echo '请选择一个网站'; exit; }
$con = mysqli_connect('localhost', 'root', 'root1234'); if(!$con) { die('连接数据库失败: ' . mysqli_error($con)); }
mysqli_select_db($con, 'php_ajax_mysql'); mysqli_set_charset($con, 'utf8');
$sql = 'select * from websites where id = ' . $v;
$result = mysqli_query($con, $sql);
echo '<table border="1" cellspacing="0" cellpadding="20" style="margin-top: 20px"> <tr style="background-color: #555; color: #fff"> <th>ID</th> <th>网站名</th> <th>网站url</th> <th>Alexa排名</th> <th>国家</th> </tr>'; while($row = mysqli_fetch_assoc($result)) { echo '<tr>'; echo '<td>' . $row['id'] . '</td>'; echo '<td>' . $row['name'] . '</td>'; echo '<td>' . $row['url'] . '</td>'; echo '<td>' . $row['alexa'] . '</td>'; echo '<td>' . $row['country'] . '</td>'; echo '</tr>'; } echo '</table>';
mysqli_close($con);
?>
|
结果:
4. 二维数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <?php echo "<pre>"; $sites = array ( "google" => array ( "Google搜索", "http://www.google.com" ), "baidu" => array ( "Baidu搜索", "http://www.baidu.com" ) ); echo $sites['google'][0] . '地址为: ' . $sites['google'][1]; echo "</pre>"; ?>
|
5. 日期
date()用于格式化时间/日期
语法:
1
| string date ( string $format [, int $timestamp ] )
|
- format:必需。规定如何格式化当前的日期和时间
- timestamp:可选。规定时间戳,默认是当前的时间和日期。
1 2 3 4 5 6 7
| <?php echo "<pre>"; echo date("Y/m/d") . PHP_EOL; echo date("Y-m-d") . PHP_EOL; echo date("Y-m-d", mktime(23, 59, 59, 12, 31, 2020)); echo "</pre>"; ?>
|
mktime()返回一个日期的 UNIX 时间戳
语法:
mktime(hour, minute, second, month, day, year);
6. 插入文件
require 和 include 除了处理错误的方式不同外,在其他方面都相同
- require 生成一个致命错误,在错误发生后脚本会停止执行
- include 生成一个警告,在错误发生后脚本会继续执行
- require 一般放在 PHP 文件的最前面,程序在执行前就会先导入要引用的文件;
- include 一般放在程序的流程控制中,当程序执行时碰到才会引用,简化程序的执行流程
上一段文字引自PHP include 和 require | 菜鸟教程 (runoob.com)
1 2 3 4 5 6
| <?php echo "<h1>测试开始<h1>"; require "./form.html"; echo "<h1>测试结束</h1>" ?>
|
另一种用法:
test.php:
1 2 3
| <?php $tt = "Hello World!"; ?>
|
practise.php
1 2 3 4
| <?php require './test.php'; echo $tt; ?>
|
7. 文件上传
form.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <html> <head> <meta charset="utf-8" /> <title>菜鸟教程(runoob.com)</title> </head>
<body> <form action="upload_file.php" method="post" enctype="multipart/form-data"> <label for="file">文件名:</label> <input type="file" name="file" id="file" /><br /> <input type="submit" name="submit" value="提交" /> </form> </body> </html>
|
upload_file.php`
1 2 3 4 5 6 7 8 9 10
| <?php if($_FILES['file']['error'] > 0) { echo '错误: ' . $_FILES['file']['error'] . '<br>'; } else { echo '上传文件名: ' . $_FILES['file']['name'] . '<br>'; echo '文件类型: ' . $_FILES['file']['type'] . '<br>'; echo '文件大小: ' . ($_FILES['file']['size'] / 1024) . ' kB<br>'; echo '文件临时存储的位置: ' . $_FILES['file']['tmp_name']; } ?>
|
上传限制和保存上传的文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| <?php $allowedExts = array('gif', 'jpeg', 'jpg', 'png'); $temp = explode('.', $_FILES['file']['name']); $extension = end($temp); if($_FILES['file']['size'] < 204800 && in_array($extension, $allowedExts)) { if($_FILES['file']['error'] > 0) { echo '错误: ' . $_FILES['file']['error'] . '<br>'; } else { echo '上传文件名: ' . $_FILES['file']['name'] . '<br>'; echo '文件类型: ' . $_FILES['file']['type'] . '<br>'; echo '文件大小: ' . ($_FILES['file']['size'] / 1024) . ' kB<br>'; echo '文件临时存储的位置: ' . $_FILES['file']['tmp_name'] . '<br>';
if(file_exists('upload/' . $_FILES['file']['name'])) { echo $_FILES['file']['name'] . '文件已经存在'; } else { move_uploaded_file($_FILES['file']['tmp_name'], 'upload/' . $_FILES['file']['name']); echo '文件存储在: ' . 'upload/' . $_FILES['file']['name']; } } } else { echo "非法的文件格式"; } ?>
|
8. Cookie
当 web 服务器向浏览器发送 web 页面时,在连接关闭后,服务端不会记录用户的信息
Cookie 的作用就是用于解决如何记录客户端的用户信息
- 当用户访问 web 页面时,他的名字可以记录在 Cookie 中
- 在用户下一次访问该页面时,可以在 Cookie 中读取用户访问记录
Cookie 以键值对的形式存储。
8.1 创建 Cookie
语法:
1
| setcookie(name, value, expire, path, domain);
|
- name: 必需。规定 cookie 的名称
- value: 必需。规定 cookie 的值
- expire: 可选。规定 cookie 的有效值
- path: 可选。规定 cookie 的服务器路径
- domain: 可选。规定 cookie 的域名
- secure: 可选。规定是否通过安全的 HTTPS 连接来传输 cookie
1 2 3 4
| <?php $expire = time() + 60*60*24*30; setcookie('user', 'clz', $expire); ?>
|
8.2 取回 Cookie 的值
通过$_COOKIE 变量取回 Cookie 的值
1 2 3 4
| <?php echo $_COOKIE['user'] . "<br>"; print_r($_COOKIE); ?>
|
简单判断是不是登录的用户
1 2 3 4 5 6 7
| <?php if(isset($_COOKIE['user'])) { echo "欢迎 " . $_COOKIE['user'] . '<br>'; } else { echo '普通访客<br>'; } ?>
|
8.3 删除 Cookie
有点巧妙,重新设置 cookie,不过把过期时间设置为过去的时间
1 2 3
| <?php setcookie('user', '', time() - 60); ?>
|
9. PHP JSON
json_encode()函数用于对变量进行 JSON 编码,执行成功则返回 JSON 数据,否则返回 false
1 2 3 4
| <?php $arr = array('a' => 1, 'b' => 2, 'c' => 3); echo json_encode($arr); ?>
|
结果:{“a”:1,”b”:2,”c”:3}
1 2 3 4 5 6
| <?php $arr = array('test' => '测试', 'baidu' => '百度'); echo json_encode($arr); echo "<br>"; echo json_encode($arr, JSON_UNESCAPED_UNICODE); ?>
|
结果:
{“test”:”\u6d4b\u8bd5”,”baidu”:”\u767e\u5ea6”}
{“test”:”测试”,”baidu”:”百度”}
json_decode() 函数用于对 JSON 格式的字符串进行解码,并转换为 PHP 变量。
1 2 3 4 5 6 7
| <?php $json = '{"a": 1, "b": 2, "c": 3}';
print_r(json_decode($json)); print '<br>'; print_r(json_decode($json, true)); ?>
|
参考:PHP 教程 | 菜鸟教程 (runoob.com)