原创内容, 转载请注明.
主要内容:
搭建 PHP 开发环境
第一个 helloworld 程序
变量
全局变量
循环结构
函数
数组
面向对象编程
继承
接口
多态
日志
文件的读写
时间格式和时区
创建图形
从远程获取图形
生成二维码
php 与数据库 mysql 的连接
mysql 数据库面向对象编程
cookie 技术
查看 cookie
session 技术
查看 session
文件上传
PHP(Hypertext Preprocessor)PHP 超文本预处理程序, 是一种嵌入 HTML 的脚本语言, 运行在服务器.
如果有一定的编程基础, 1 小时之内看完 so easy!
搭建 PHP 开发环境
PHP 开发环境主要 3 部分: 服务器 Apache, 编程语言 PHP, 数据库 MySQL. 搭建开发环境, 直接使用 XAMPP 集成安装就可以.
XAMPP=Apache+MySQL+PHP+Perl,X 表示的是跨平台.
官网下载安装即可: https://www.apachefriends.org/zh_cn/index.html
( 安装太简单了, 没有什么可说的, 不过如果以前安装过 tomcat,apache,MySQL 等, xampp 的部分功能可能不能使用, 解决办法网上很多, 不再赘言)
第一个 helloworld 程序
php 可以使用 note++ 进行编辑.
helloworld.php
- <?php
- echo "hello world!";
- ?>
然后运行 XAMPP 的控制面板, 点击 Apache 的 start, 绿色就是正常运行了.
然后将 helloworld.php 文件放在路径: C:\xampp\htdocs
浏览器输入: http://localhost/helloworld.php
ok, 我们的第一个 PHP 程序就完成了.
ps: 以后我们将 php 文件放在一个单独的文件夹 basic 中, 便于管理
变量
变量, 存储数据的容器, 在 php 中, 使用 $(美元符号)开头的就是变量, 可以给变量赋值, 或者输出变量的值.
另外, php 语句以;(英文状态半角的分号)结束.
- <?php
- //$ 定义变量
- $text='this is a text';
- // 输出变量
- echo $text;
- ?>
全局变量
全局变量就是在所有的 php 文件范围内都可以使用的变量(变量的概念, 存储数据的容器)
最常用的全局变量有 $_GLOBAL,$_SERVER,$COOKIE,$_SESSION,__FILE__(注意是 2 个下划线),__LINE__
php 文件是嵌入到 html, 的一种语言, 运行在服务器端, 可以和 html 语言混合书写.
这里的.(点号)表示拼接字符串, echo 可以输出字符串.
global.php
- <?php
- echo '当前执行脚本文件名:'.$_SERVER['PHP_SELF'].'<br/>';
- echo '当前执行脚本根目录:'.$_SERVER['DOCUMENT_ROOT'].'<br/>';
- // 单行注释
- echo '当前执行脚本绝对路径:'.$_SERVER['SCRIPT_FILENAME'].'<br/>';
- //print_r($_SERVER);
- // 返回当前文件名, 行号
- echo '当前文件名称:<strong>'.__FILE__.'</strong><br/>';
- echo '当前行号:<strong>'.__LINE__.'</strong><br/>';
- ?>
打开浏览器, 输入: http://localhost/basic/global.php
循环结构
循环主要就是 for 循环, 和 while 循环, 可以重复执行某一个动作, 直到满足条件
for(初始化计数值; 满足条件就继续执行 ; 执行后的操作, 将计数值 + 1){ 执行的代码; }
while( 满足条件就继续执行){ 执行的代码; 将计数值 + 1 ; }
for_while.php
- <?php
- //for 循环
- for($i=0;$i<10;$i++){
- echo 'good!';
- }
- echo '<br/>';
- //while 循环
- $j=0;
- while($j<5){
- echo 'do...';
- $j++;
- }
- ?>
打开浏览器, 输入: http://localhost/basic/for_while.php
函数
这是任何一种语言的重点, 包括 php
func.php
- <?php
- sum(1,3);
- // 定义求和函数, 带 2 个参数
- function sum($a,$b){
- echo "$a+$b=".($a+$b);// 双引号会输出变量, 单引号输出字符串
- echo '<br/>';
- echo '$a+$b='.($a+$b);
- }
- ?>
- ?>
打开浏览器, 输入: http://localhost/basic/func.php
数组
数组分为索引数组, 关联数组, 使用 print_r(数组)来输出数组内容
var_dump(数组)查看详细信息
可以使用 foreach(数组 as 键 => 值){ } 来循环输出数组
array.php
- <?php
- // 索引数组
- $arr=array('小李','25','男','开发工程师');
- print_r($arr);
- //Array ( [0] => 小李 [1] => 25 [2] => 男 [3] => 开发工程师 )
- // 关联数组
- $array=array('姓名'=>'小明','年龄'=>'25','性别'=>'男','职业'=>'开发工程师');
- print_r($array);
- //Array ( [姓名] => 小明 [年龄] => 25 [性别] => 男 [职业] => 开发工程师 )
- echo '<br/>';
- // 输出详细信息
- var_dump($arr);
- /*array(4) {
- [0]=> string(6) "小李"
- [1]=> string(2) "25"
- [2]=> string(3) "男"
- [3]=> string(15) "开发工程师"
- }*/
- echo '<br/>';
- // 循环输出数组
- foreach($array as $k=>$v){
- echo "键值对:$k --> $v".'<br/>';
- }
- /**
- 键值对: 姓名 --> 小明
- 键值对: 年龄 --> 25
- 键值对: 性别 --> 男
- 键值对: 职业 --> 开发工程师
- */
- ?>
以下内容就是编程技术的分水岭, 面向对象编程
面向对象编程
在面向对象编程的思想中, 有最重要的 2 句话:
类用来封装代码
对象用来封装数据
首先来学习怎么样定义一个类:
类名前 + class, 类中有 public 的属性, 如 $name,$sex,$age, 还有 public 的方法 say()
在类中, 只要 new 一个对象, 就自动会执行__construct 构造方法
一个类被销毁, 或者程序执行完毕, 自动执行__destruct()解构方法
类的属性和方法, 通过对象 ->指针符号调用
$this 表示当前对象.
classMehtod.php
- <?php
- // 定义一个类
- class ren{
- public $name;
- public $sex;
- public $age;
- // 成员方法
- public function say(){
- echo '我的名字是'.$this->name.', 性别是'.$this->sex.','.$this->age.'岁了 < br/>';
- }
- // 构造方法, 只要 new 就会执行
- function __construct($name,$sex,$age){
- $this->name=$name;
- $this->sex=$sex;
- $this->age=$age;
- echo '构造对象'.$this->name.'<br/>';
- }
- // 解构方法, 程序结束, 对象销毁时执行
- function __destruct(){
- echo '解构对象'.$this->name.'<br/>';
- }
- }
- // 实例化对象
- $xiaoli=new ren('小李','男','25');
- $xiaoli->say();
- /* 输出:
- 构造对象小李
- 我的名字是小李, 性别是男, 25 岁了
- 解构对象小李
- */
- ?>
继承
面向对象编程思想中, 有 3 个核心概念:
封装
继承
多态
封装其实就是类, 定义类就是将代码封装起来了.
其次就是继承!
继承的关键字: extends
$this 表示当前对象.
一个 B 类继承另外一个类 A,B 会自动拥有 A 的所有的属性和方法, 而不用再书写一遍(继承的思想, 程序员懒惰的直接体现, 要是程序员也有一个有钱的爹可以继承财富该多好...)
inherit.php
- <?php
- // 申明 tool 类
- class tool{
- function on(){
- echo '<br/>启动 < br/>';
- }
- function run(){
- echo '<br/>运行 < br/>';
- }
- function off(){
- echo '<br/>关闭 < br/>';
- }
- }
- // 继承 inherit
- class fan extends tool{
- function app(){
- $this->on();
- $this->run();
- $this->off();
- }
- }
- // 简化使用
- $haierFan=new fan();
- $haierFan->app();
- ?>
接口
接口是一种更加高级的继承方法
定义接口的关键字: interface
实现 (继承) 接口的关键字: implements
接口中的所有的方法都是默认 public 的, 而且只要定义, 不用实现(在实现类中实现具体方法)
interface.php
- <?php
- // 申明接口
- interface tool{
- function on();
- function run();
- function off();
- }
- // 实现接口
- class fan implements tool{
- public $name;
- function on(){
- echo '<br/>'.$this->name.'风扇启动 < br/>';
- }
- function run(){
- echo '<br/>'.$this->name.'风扇运行 < br/>';
- }
- function off(){
- echo '<br/>'.$this->name.'风扇关闭 < br/>';
- }
- function __construct($name){
- $this->name=$name;
- }
- }
- // 继承 inherit
- class haierfan extends fan{
- function app(){
- $this->on();
- $this->run();
- $this->off();
- }
- }
- // 实例化
- $fan=new fan('美的');
- $fan->on();
- $fan->run();
- $fan->off();
- echo '<br/> ------------ 分割线 ------------ <br/>';
- // 实例化
- $haierfan=new haierfan('海尔');
- $haierfan->app();
- ?>
多态
作为面向对象编程的 3 大思想之一, 多态也是一种高级技能
多态一般都是通过接口来实现的
就是调用同一个方法, 执行得到的结果却不同!!!
通过输入参数的不同, 执行结果不同, 这就是多态
polymorphism.php
- <?php
- // 申明接口
- interface tool{
- function on();
- function run();
- function off();
- }
- // 实现接口
- class fan implements tool{
- public $name;
- function on(){
- echo '<br/>'.$this->name.'风扇启动 < br/>';
- }
- function run(){
- echo '<br/>'.$this->name.'风扇运行 < br/>';
- }
- function off(){
- echo '<br/>'.$this->name.'风扇关闭 < br/>';
- }
- function __construct($name){
- $this->name=$name;
- }
- }
- // 实现接口
- class engine implements tool{
- public $name;
- function on(){
- echo '<br/>'.$this->name.'发动机启动 < br/>';
- }
- function run(){
- echo '<br/>'.$this->name.'发动机运行 < br/>';
- }
- function off(){
- echo '<br/>'.$this->name.'发动机关闭 < br/>';
- }
- function __construct($name){
- $this->name=$name;
- }
- }
- // 状态类
- class toolStatus{
- function ts($tool){
- $tool->on();
- $tool->run();
- $tool->off();
- }
- }
- // 应用多态 polymorphism
- $fan=new fan('海尔');
- $engine=new engine('奥迪');
- $toolStatus=new toolStatus();
- $toolStatus->ts($fan);
- $toolStatus->ts($engine);
- ?>
这又是一条牛逼的分割线, php 基本功能就是以上的内容, 下面是一些更加高阶玩法.
日志
log.php
- <?php
- /*
- 1, 设置 php.ini 文件
- 2, 日志分类
- 3, 查看日志
- */
- // 生成运行日志
- error_log("FORM".__FILE__."ERROR LINE:".__LINE__);
- /* 需要设置正确的日志路径, 确保路径存在
- [15-Sep-2018 09:31:45 Europe/Berlin]
- 这是来自 C:/xampp/htdocs/basic/log.php 的一段自定义的报错日志信息
- */
- // 生成系统日志
- openlog('PHP7',LOG_PID,LOG_USER);
- syslog(LOG_WARNING,'向 syslog 发送自定义信息');
- closelog();
- try{
- $a=10;
- if(isset($b)){
- echo "程序正常执行";
- }else{
- throw new Exception();
- }
- }catch(Exception $e){
- ERROR_LOG("错误代码所在路径:".$e->getFile());
- ERROR_LOG( "错误代码所在行号:".$e->getLine());
- }
- echo "<br/>程序执行完毕 < br/>";
- /*
- [15-Sep-2018 09:44:41 Europe/Berlin] 错误代码所在路径: C:\xampp\htdocs\basic\log.php
- [15-Sep-2018 09:44:41 Europe/Berlin] 错误代码所在行号: 26
- */
- // 输出日志 依赖于文件的读写操作, 后续将会学习
- ?>
查看运行日志
查看系统日志
显示乱码主要是编码字符集的问题, 将 log.php 文件保存为 ANSI 格式即可看到中文正常显示, 解决方法网上很多.
文件的读写
fileIO.php
- <?php
- // 读取文件
- //readfile('./test.txt');
- // 访问远程文件, 需要设置 php.ini 的 allow_fopen=On
- $html=file_get_contents('http://www.baidu.com');
- // 输出 html 页面
- //echo $html;
- // 设置时区
- // 可以在文件开头位置设置默认配置的时区, 也可以在 php.ini 中进行设置
- ini_set('date.timezone','Asia/Shanghai');
- //date_default_timezone_set('asia/shanghai');
- // 向文件中写入内容
- /*
- 1, 打开文件
- 2, 写入数据
- 3, 关闭文件
- */
- //$file=fopen('./test.txt','a+');// 追加模式
- //$file=fopen('./test.txt','r+');// 半覆盖(数据多少覆盖多少)
- $file=fopen('./test.txt','w+');// 全覆盖
- if($file){
- fwrite($file,'写数据 123!\r\n 换行了吗?\r\n');// 单引号不会换行
- fwrite($file,"写数据 123!\r\n 换行了吗?\r\n");// 双引号换行
- echo date("Y-m-d H:i:s").'写入数据成功'.date("Ymd His");
- fclose($file);
- }
- ?>
时间格式和时区
time.php
- <?php
- // 设置时区
- echo '<br/>默认时区时间:'.date("Y-m-d H:i:s").'<br/>';
- // 可以在文件开头位置设置默认配置的时区
- // 也可以在 php.ini 中进行设置 date.timezone(所有文件生效)
- ini_set('date.timezone','Asia/Shanghai');
- echo '<br/>上海时区时间:'.date("Y-m-d H:i:s").'<br/>';
- // 或者直接设置时间格式
- date_default_timezone_set('asia/tokyo');
- echo '<br/>东京时区时间:'.date("Y-m-d H:i:s").'<br/>';
- echo '<br/>格式化时间:'.date("YmdHis").'<br/>';
- /*
- 默认时区时间: 2018-09-15 10:44:03
- 上海时区时间: 2018-09-15 16:44:03
- 东京时区时间: 2018-09-15 17:44:03
- 格式化时间: 20180915174403
- */
- ?>
创建图形
image.php
- <?php
- // 创建画布
- $img=imagecreate(500,500);
- // 设置颜色
- // 背景色
- $white=imagecolorallocate($img,255,255,255);
- // 画笔
- $black=imagecolorallocate($img,0,0,0);
- // 矩形
- imagerectangle($img,100,100,300,300,$black);
- // 输出图像前清理输出缓冲
- ob_clean();
- // 解决 chrome 兼容性问题
- header("Content-type:image/jpeg");
- // 输出图像到浏览器
- imagejpeg($img) or die("创建图像失败 < br/>");
- // 释放资源
- imagedestroy($img);
- ?>
从远程获取图形
imageUrl.php
- <?php
- $img=imagecreatefromjpeg('https://b-ssl.duitang.com/uploads/item/201607/04/20160704052649_WLyfB.jpeg');
- ob_clean();
- header('Content-type:image/jpeg');
- imagejpeg($img) or die('创建图形失败');
- imagedestroy($img);
- ?>
生成二维码
vcode.php
- <?php
- vcode(150,100);
- // 生成验证码
- function vcode($width,$high){
- // 创建画布
- $img=imagecreate($width,$high);
- // 设置背景色 黑色
- $black=imagecolorallocate($img,0,0,0);
- // 设置画笔 白色
- $white=imagecolorallocate($img,255,255,255);
- // 产生随机干扰线条
- for($i=0;$i<$width/20;$i++){
- imageline($img,rand(0,$width),rand(0,$high),rand(0,$width),rand(0,$high),$white);
- }
- // 产生随机干扰点
- for($i=0;$i<$width;$i++){
- imagesetpixel($img,rand(0,$width),rand(0,$high),$white);
- }
- // 产生 4 个随机字母, 数字
- $data='';
- for($i=0;$i<4;$i++){
- switch(rand(1,3)){
- case '1':$ch=rand(0,9);break;
- case '2':$ch=sprintf('%c',rand(65,90));break;
- case '3':$ch=sprintf('%c',rand(97,122));break;
- }
- $data=$data.$ch;
- }
- // 绘制 truetype 文字
- imagettftext($img,$high/3,rand(1,15),$width*0.1,$high*0.7,$white,'C:/Windows/Fonts/Arial.ttf',$data);
- // 清理缓存
- ob_clean();
- // 解决 chrome 兼容性问题
- header('Content-type:image/jpeg');
- // 输出到浏览器
- imagejpeg($img) or die('创建画布失败');
- imagedestroy($img);
- }
- ?>
php 与数据库 mysql 的连接
mysql.php
- <?php
- // 连接数据库
- $host='localhost';
- $username='root';
- $password='';
- $database='my_db';
- $conn=mysqli_connect($host,$username,$password,$database) or die('数据库连接失败!');
- //echo '数据库连接成功!';
- // 操作数据库
- $sql='select * from cartoon';
- $result=mysqli_query($conn,$sql);
- // 读取返回信息
- while($obj=mysqli_fetch_assoc($result)){
- echo $obj['name'].'现在'.$obj['age'].'岁了.<br/>';
- }
- // 关闭数据库连接
- mysqli_close($conn);
- ?>
MySQL 数据库面向对象编程
mysql_obj.php
- <?php
- // 创建连接
- $conn = new mysqli('localhost', 'root', '','my_db')or die(" 连接失败: " . $conn->connect_error);
- if($conn){
- echo "数据库连接 < br/>";
- }
- // 操作数据库
- $sql = "SELECT * FROM cartoon;";
- $result=$conn->query($sql);
- while($row=$result->fetch_assoc()){
- echo "name:".$row['name']."-country:".$row['country']."<br/>";
- }
- /*
- name: 校长 - country: 中国
- name: 西门庆 - country: 中国
- name: 武大郎 - country: 中国
- name: 武松 - country: 中国
- */
- // 关闭连接
- //$conn->close();
- //$conn2=new mysqli('localhost','root','','my_db') or die('连接失败:'.$conn2->connect_error);
- $sql2="SELECT * FROM cartoon;";//sql 语句一定要用双引号!!!
- $result2=$conn->query($sql2);
- //print_r($conn2->query($sql2));
- while($row2=$result2->fetch_assoc()){
- echo 'name:'.$row2['name'].',sex:'.$row2['sex'].'<br/>';
- }
- $conn->close();
- echo "数据库关闭 < br/>";
- ?>
cookie 技术
cookie.php
cookie 可以用于页面之间传值, 没有设置有效时间, 那么默认为浏览器关闭失效
这就是会话 cookie, 保存在内存中
(关闭页面不会失效, 关闭浏览器才会失效)
cookie.php
- <?php
- // 访问时间
- echo '访问时间 < br/>';
- if(isset($_COOKIE['visittime'])){
- echo '您上一次访问本网站是在:'.$_COOKIE['visittime'].'<br/>';
- echo '本次访问时间是:'.date('Y-m-d H:i:s').'<br/>';
- setcookie('visittime',date('Y-m-d H:i:s'));
- }else{
- setcookie('visittime',date('Y-m-d H:i:s'));
- echo '这是您第一次访问本网站 < br/>';
- }
- // 访问次数
- echo '访问次数 < br/>';
- if(isset($_COOKIE['num'])){
- setcookie('num',$_COOKIE['num']+1);
- echo '这是您第'.$_COOKIE['num'].'次访问本网站 < br/>';
- }else{
- setcookie('num',1+1);
- echo '欢迎您首次访问本网站 < br/>';
- }
- /*
- 访问时间
- 您上一次访问本网站是在: 2018-09-16 05:09:22
- 本次访问时间是: 2018-09-16 05:09:32
- 访问次数
- 这是您第 2 次访问本网站
- */
- // 删除 cookie, 有效时候为过去时间即可, time()-1
- setcookie('num',1,time()-1);
- echo '$_COOKIE[num]已被注销 < br/>';
- print_r($_COOKIE);// 再一次刷新页面时才会生效!!!
- ?>
查看 cookie
testcookie.php
- <?php
- // 创建 cookie
- $sta=setcookie('testcookiename','testvalue',time()+60*60);
- if($sta){
- echo 'Cookie 设置成功!';
- }
- ?>
chrome 浏览器查看 cookie
打开浏览器的设置》高级设置》
隐私设置 / 内容设置》所有 cookie 和网站数据
》找到你的网站名, 以及 cookie 的名字, 点击打开即可看到保存到 cookie 的内容.
session 技术
session 存储在服务器, 更安全, 没有长度限制
而 cookie 存储在客户机, 客户可以禁用 cookie
session 可以用于跨页面请求, 有一个随机生成的唯一的 session_id
典型的应用就是购物车
session.php
- <?php
- /*
- session 技术
- session 存储在服务器, 更安全, 没有长度限制
- 而 cookie 存储在客户机, 客户可以禁用 cookie
- session 可以用于跨页面请求, 有一个随机生成的唯一的 session_id
- 典型的应用就是购物车
- */
- // 准备工作, 设置 php.ini 的 session.save_path="C:\xampp\tmp"
- // 启动会话
- session_start();
- // 设置 session
- $_SESSION['name']='Peter';
- $_SESSION['password']='12345';
- echo 'Session 创建成功!<br/>';
- /* 打开服务器的 session 文件查看
- name|s:5:"Peter";password|s:5:"12345";
- */
- print_r($_SESSION);
- // 清空 session,session 文件只是清空
- $_SESSION=array();
- echo '<br/>注销当前回话 session<br/>';
- print_r($_SESSION);
- // 销毁 session 文件, session 文件会被删掉
- session_destroy();
- echo '<br/>session 已经彻底销毁 < br/>';
- print_r($_SESSION);
- ?>
查看 session
如果销毁了 session
文件上传
file_upload.php
- <html>
- <form method='post' enctype='multipart/form-data'>
- <input type='file' name='upfile' />
- <input type='submit' value='上传' />
- </form>
- </html>
- <?php
- if(!empty($_FILES)){
- print_r($_FILES);
- $tmpname=$_FILES['upfile']['tmp_name'];// 文件临时名
- $name=$_FILES['upfile']['name'];// 文件原名
- // 文件会上传到与该页面文件同一个目录
- move_uploaded_file($tmpname,$name) or die('文件上传失败, 程序退出!');
- echo '<br/>文件上传成功!<br/>';
- }else{
- echo '<br/>没有上传文件 < br/>';
- }
- ?>
ok, 基本上 php 的内容学到这里, 就可以了.
来源: https://www.cnblogs.com/1906859953Lucas/p/9656386.html