PHP笔记

PHP

HTML,CSS,JS

PHP简介

AJAX

PHP

基础语法

<!-- 形式 -->
<?php
    echo "Hello world!";

        
//注释
/*
注释
*/
        
//变量,应用,句点链接及echo
//echo 将传到客户端,即浏览器。
$a = 'hello';
$b = $a . 'world';
echo $b;
unset($b);
echo $b;
//弱类型语言
$foo = true;
$foo = 12;
$foo = 1.2;
$foo = 'hello';
//强制转化
intval(...);
floatval(...);
strval(...);
//判断类型的函数
gettype(...);
is_int(...);
is_string(...);
is_float(...);
//常量(一般大写)
//定义常量
define("FOO", "something");
//调用常量
FOO;
//预定义常量(也叫魔术常量)(不需要赋值)
PHP_EXTENSION_DIR;
__LINE__;
__FILE__;
__DIR__;
__FUNCTION__;
__CLASS__;
//等

//运算符
// + - * / % = == === != !== <=> > >= < <= && || ^ += ++i i++ i-- --i

//组合类型
//特殊类型
//这俩暂略
?>
        

控制结构

<?php
//条件
//1. if ... elseif ... else
//2. ... ? ... : ...
//3. switch ...{case ... : ... break; default: ... break;}
//循环
//1. while ...
//2. do ... while
//3. for ...
//4. foreach $array as $value
//	 foreach $array as $key => $value
//循环中断关键字: break  continue

?>
练习1
  1. 创建一个名为menu.HTML的简单HTML页面

    它应该显示一个包含四个选项的问题

    (Which language do you prefer?

    Button1:HTML

    Button2:CSS

    Button3:JavaScript

    Button4:PHP)

  2. 在按钮上单击:
    应该在response.php文件中触发一个AJAX 请求
    发送单击的按钮内部文本。
    被调用的脚本应该仅是PHP

  3. 在response.php中:
    根据单击的按钮进行回答
    使用if或switch语句
    在文件末尾回显结果

  4. 在AJAX响应之后:alert结果

数组

<?php
//声明
$fruits =['apple', 'peach', 'pear'];
echo $fruits[2];// Displays pear
echo $fruits[0];// Displays apple
$fruits[2] = 'apricot';
echo $fruits[2];// Displays apricot
//列出所有数组内容
print_r($fruits);
//数组元素的个数
count($fruits);
sizeof($fruits);
//在数组最后加入一个元素
array_push($fruits,'banana');
//删除元素
unset($fruits[1]);
//加入元素
$fruits[1] = 'banana';
//在数组最后删除一个元素
array_pop($fruits);
//在数组开始删除一个元素
array_shift($fruits);
//在数组开始加入一个元素
array_shift($fruits,'banana');
//顺序排序(从小到大)
sort($fruits);
//逆序排序(从大到小)
rsort($fruits);
?>

函数

<?php
//声明,调用,变量的作用域 略

//可空的返回值
function foo(string $arg1):?string{
    if($arg1 == 'hello'){
        return $arg1 . 'world';
    }else{
        return null;
    }
}
//global关键字 略
//按引用传递

function foo(&$arg1){
    $arg1 += 10;
}
$i = 10;
foo($i);
echo $i;//display 20

//匿名函数 通过赋值给变量 详略
// use关键字
$label = 'name';$separator = ':';

$concat = function($text) use ($label,$separator){
    echo $label . $separator . $text;
};

$concat("123");//display 'name:123'

//array_walk()函数
$target = array('foo','bar','boom','baz');
$func = function($val,$key)use(&$target){
    if($val == 'bar') unset($target[$key]);
};

array_walk($target,$func);
var_dump($target);
?>
练习2

日期管理

<?php
//unix时间戳 略

//获取现在时间(以unix时间戳的形式)
time();
//得到对应参数的时间戳(h,m,s,M,D,Y)
mktime(16,18,34,07,22,2012);
//得到对应时间(自定义格式)
//不使用第二个参数,返回格式正确的当前日期字符串
date("d/m/y H:i:s",1342966714);
//验证是不是正确的日期
checkdate(12,31,2000);
?>

数学函数

<?php
sqrt(25);
pow(2,8);
exp(1);
ceil(6.9);
floor(6.9);
round(3.4);
round(3.5);
round(1.95582,2);
?>

信息函数

<?php
//显示有关一个或多个表达式(类型和值)的信息
var_dump($array);
//获取有关给定变量的信息,以有效的PHP代码表示
var_export($array);
//以人类可读的方式显示有关给定数组的信息
print_r($array);
?>

提交表单

<?php
//预定义变量
$_GET;//包含通过查询字符串发送的数据的关联数组
$_POST;//包含通过请求正文发送的数据的关联数组
$_FILES;//通过POST方法上传的文件的关联数组
?>

COOKIES和SESSIONS

Cookies

存储在用户计算机中的一段文本

由一个或多个键值对组成

在HTTP消息头中发送

可以有过期日期

如果没有,则在web浏览器退出时销毁

<?php
//另一个预定义变量
$_COOKIE;//包含站点最新文档的关联数组
//向客户端发送新cookie
//与其他标头一样,cookies必须在任何输出之前出现
setcookie('cookie1', $content1);
setcookie('cookie2', $content2, time() + 60 * 60 * 24 * 30);
//检索cookie:
echo $_COOKIE['cookie1'];
//销毁cookie:
setcookie('cookie1', ' ', 1);
?> 
Sessions

您在计算机上操作某个应用程序时,您打开它,做些更改,然后关闭它。这很像一次对话(Session)。计算机知道您是谁。它清楚您在何时打开和关闭应用程序。然而,在因特网上问题出现了:由于 HTTP 地址无法保持状态,Web 服务器并不知道您是谁以及您做了什么。

PHP session 解决了这个问题,它通过在服务器上存储用户信息以便随后使用(比如用户名称、购买商品等)。然而,会话信息是临时的,在用户离开网站后将被删除。如果您需要永久存储信息,可以把数据存储在数据库中。

Session 的工作机制是:为每个访客创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,或者通过 URL 进行传导。

<?php
//启动会话
session_start();
//存储 Session 变量
$_SESSION['views']=1;
//销毁Session
unset($_SESSION['views']);
//或
session_destroy();  
?>

包含函数

在 PHP 中,您可以在服务器执行 PHP 文件之前在该文件中插入一个文件的内容。

include 和 require 语句用于在执行流中插入写在其他文件中的有用的代码。

include 和 require 除了处理错误的方式不同之外,在其他方面都是相同的:

  • require 生成一个致命错误(E_COMPILE_ERROR),在错误发生后脚本会停止执行。
  • include 生成一个警告(E_WARNING),在错误发生后脚本会继续执行。
<?php
//不要重复调用,用once可以解决重复调用问题
include 'filename';
require 'filename';
require_once 'filename';
include_once 'filename';
?>

文件操作

<?php
//判断文件是否存在
$file = "file.txt";
if(file_exists($file)){
    echo "The file $file exists";
}else {
    echo "The file $file does not exist";
}
//打开关闭文件
$file = fopen("file.txt", "r");
fclose($file);

//读一个文件
$file = fopen("file.txt","r");
$size = filesize("file.txt");
$content = fread($file, $size);
fclose($file);
echo $content;
//或者
$url = "http://www.website.com/file.txt";
$file = fopen($url, "r");
$content = "";
while($package = fread($file, 16)){
    $content = $content . $package;
}
fclose($file);
echo $content;
//再或者使用fgets()
$url = "http://www.website.com/file.txt";
$file = fopen($url, "r");
$content ="";
while(!feof($file)){
    $content = $content . fgets($file, 4096);
}
fclose($file);
echo $content;
//再或者(最简单方法)
$content = file_get_contents("file.txt");
echo $content;

//写一个文件--fwrite()或 fputs(),这俩完全一样,只是名字不同
$file = fopen("file.txt", "r+");
fwrite($file, "Welcome in SUPINFO");
fclose($file);
include "file.txt";
//再或者简单方法
//file_put_contents()完全调用fopen(),fwrite(),fclose()
file_put_contents("file.txt", "Welcome in SUPINFO");
include"file.txt";

//文件夹中的内容
//打开,读取,关闭
$folder = "my_folder/";
$dir = opendir($folder);
while($file = readdir($dir)){
    echo "$file<br />";
}
closedir($dir);
//复制文件
$file = "file.txt";
$copy = "file_copy.txt";
if(copy($file, $copy)){
    echo "The file has been copied";
}
//删除文件
$file = "file.txt";
if(unlink($file)){
    echo "The file has been deleted";
}
?>

OOP 和 PHP

一些OOP的回忆

封装

public(default)

private

protected

setxxx()

getxxx()

继承

extends

方法重写,调用父类方法

parent::methodName()

抽象类:不能实体化,由抽象方法组成,不能定义方法内容,只能由子类定义

接口:不能实体化,由抽象方法组成,不能定义方法内容,只能由子类定义

<?php
//定义抽象类
abstract class Vehicle {
    ...
}
//定义接口
interface MyInterface{
    ... 
}
//实现接口
class MyClass implements InterfaceName{ 
    ...
}
?>

抽象类可以:具有实函数(不仅仅是抽象),具有属性

一个类可以继承一个类,一个类可以实现几个接口

异常处理

本部分参考菜鸟教程 https://www.runoob.com/php/php-exception.html

PHP 5 提供了一种新的面向对象的错误处理方法。

异常是个类,由PHP自带,若要自定义,需要继承Exception类。

异常处理用于在指定的错误(异常)情况发生时改变脚本的正常流程。这种情况称为异常。

当异常被触发时,通常会发生:

  • 当前代码状态被保存
  • 代码执行被切换到预定义(自定义)的异常处理器函数
  • 根据情况,处理器也许会从保存的代码状态重新开始执行代码,终止脚本执行,或从代码中另外的位置继续执行脚本

我们将展示不同的错误处理方法:

  • 异常的基本使用
  • 创建自定义的异常处理器
  • 多个异常
  • 重新抛出异常
  • 设置顶层异常处理器

**注释:**异常应该仅仅在错误情况下使用,而不应该用于在一个指定的点跳转到代码的另一个位置。

当异常被抛出时,其后的代码不会继续执行,PHP 会尝试查找匹配的 “catch” 代码块。

如果异常没有被捕获,而且又没用使用 set_exception_handler() 作相应的处理的话,那么将发生一个严重的错误(致命错误),并且输出 “Uncaught Exception” (未捕获异常)的错误消息。

我们需要创建适当的代码来处理异常。

适当的处理异常代码应该包括:

  1. Try - 使用异常的函数应该位于 “try” 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
  2. Throw - 里规定如何触发异常。每一个 “throw” 必须对应至少一个 “catch”。
  3. Catch - “catch” 代码块会捕获异常,并创建一个包含异常信息的对象。
<?php
//自定义异常
class customException extends Exception
{
    public function errorMessage()
    {
        // 错误信息
        $errorMsg = '错误行号 '.$this->getLine().' in '.$this->getFile()
        .': <b>'.$this->getMessage().'</b> 不是一个合法的 E-Mail 地址';
        return $errorMsg;
    }
}
 
$email = "someone@example.com";
 
try
{
    // 检测邮箱
    if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
    {
        // 如果是个不合法的邮箱地址,抛出异常
        throw new customException($email);
    }
    // 检测 "example" 是否在邮箱地址中
    if(strpos($email, "example") !== FALSE)
    {
        throw new Exception("$email 是 example 邮箱");
    }
}
catch (customException $e)
{
    echo $e->errorMessage();
}
catch(Exception $e)
{
    echo $e->getMessage();
}
?>

设置顶层异常处理器 -> 详见菜鸟教程(老师没讲)

命名空间

<?php
//namespace关键字为当前脚本定义区域–所有实例都将与此命名空间相关
namespaceBlog;classPost {
    // ...
}
$post = new Post(); // Works as weare in namespace Blog
$date = new DateTime(); 	// Fatal error, undefined class
						// DateTime in namespace Blog
$date = new\DateTime(); // Global Namespace represented as “\”
?>
<?php
//定义名称空间的可选语法:可以在同一个文件中定义多个名称空间,括号外不能有代码!
namespaceBlog {
    // Code for Blog namespace
}
namespaceFoo{
    // Code for Foonamespace
}
?>
<?php
//使用关键字Use从当前命名空间外部导入类
namespaceBlog;
//Inclusion statements here,if any.
Include(‘Info.php’);//Namespace Blog\Infoincluded,
					//in which the class Author defined.
Use Blog\Info\Author;//Import Blog\Info\Author intocurrent NS
class Post {
    // ...
}
$post = newPost(); // Post class of Blog namespace
$author=newAuthor();

?>

PHP 命名空间中的类名可以通过三种方式引用:

  1. **非限定名称,或不包含前缀的类名称,**例如 $a=new foo();foo::staticmethod();。如果当前命名空间是 currentnamespacefoo 将被解析为 currentnamespace\foo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,则 foo 会被解析为foo。 警告:如果命名空间中的函数或常量未定义,则该非限定的函数名称或常量名称会被解析为全局函数名称或常量名称。
  2. **限定名称,或包含前缀的名称,**例如 $a = new subnamespace\foo();subnamespace\foo::staticmethod();。如果当前的命名空间是 currentnamespace,则 foo 会被解析为 currentnamespace\subnamespace\foo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,foo 会被解析为subnamespace\foo
  3. **完全限定名称,或包含了全局前缀操作符的名称,**例如, $a = new \currentnamespace\foo();\currentnamespace\foo::staticmethod();。在这种情况下,foo 总是被解析为代码中的文字名(literal name)currentnamespace\foo
<?php
namespace Blog;
//Inclusion statements here,if any.
Include(‘Info.php’);//Namespace Blog\Info included,
					//in which the class Author defined.
Use Blog\Info\Author;//Import Blog\Info\Author into current NS
						//with “class name” as “default alias”.
class Post {
    // ...
}
$post = new Post(); // Using Unqualified name
$author=new Info\Author();//Using Qualified Name
$author=new \Blog\Info\Author();//Using Fullly Qualified Name
$author=new Author();//Using Default Alias

?>

使用别名:使用关键字创建别名,别名是仅在当前命名空间中有效的“名称”;导入的类的默认别名是“非限定名称”–对于许多名称空间更具可读性。

<?php
namespace Blog;
//Inclusion statements here,if any.
Include(‘Info.php’);//Namespace Blog\Info included,
					//in which the class Author defined.
Use Blog\Info\Author as TheAuthor;
$author=new TheAuthor();//Using Alias
?>

我们也可以在当前命名空间中的类上使用别名。例子略。

PDO:PHP Data Object

安装

只需要在php.ini中激活它们

PDO类

我们将使用的三个主要PDO类是:

–PDO:数据库链接

–PDO Statement:语句及其结果

–PDO Exception:发生错误时引发的异常

<?php
//链接到localhost
//DSN Database Sourse Name
$DSN = "mysql:host=localhost";
$username = "root";
$password = "";

try {
    $conn = new PDO($DSN, $username, $password);

    // 设置 PDO 错误模式为异常
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sql = "CREATE DATABASE myDBPDO";

    // 使用 exec() ,因为没有结果返回
    $conn->exec($sql);

    echo "数据库创建成功<br>";
}
catch(PDOException $e)
{
    echo $sql . "<br>" . $e->getMessage();
}

$conn = null;
?> 
<?php
//连接到数据库test(前提是有这个数据库)
$DSN = "mysql:host=localhost;dbname=test";
$username = "root";
$password = "";
 
try {
    $conn = new PDO(, $username, $password);
    // 设置 PDO 错误模式,用于抛出异常
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

}
catch(PDOException $e)
{
   echo "链接成功";
}
 
$conn = null;
?>

<?php
// int PDO::exec ( string $statement )
//PDO::exec() 在一个单独的函数调用中执行一条 SQL 语句,返回受此语句影响的行数。
//PDO::exec() 不会从一条 SELECT 语句中返回结果。
//对于在程序中只需要发出一次的 SELECT 语句,可以考虑使用 PDO::query()。
//例子
$dbh = new PDO('odbc:sample', 'db2inst1', 'ibmdb2');

/*  删除 FRUIT 数据表中满足条件的所有行 */
$count = $dbh->exec("DELETE FROM fruit WHERE colour = 'red'");

/* 返回被删除的行数 */
print("Deleted $count rows.\n");

//public PDOStatement PDO::query ( string $statement )
//public PDOStatement PDO::query ( string $statement , 
//							int $PDO::FETCH_COLUMN , int $colno )
//public PDOStatement PDO::query ( string $statement , 
//							int $PDO::FETCH_CLASS , string $classname , array $ctorargs )
//public PDOStatement PDO::query ( string $statement , 
//							int $PDO::FETCH_INTO , object $object )
//PDO::query() 在一个单独的函数中调用并执行 SQL 语句, 返回结果集 (如果有),语句作为一个PDOStatement对象返回。
//例子
function getFruit($conn) {
    $sql = 'SELECT name, color, calories FROM fruit ORDER BY name';
    foreach ($conn->query($sql) as $row) {
        print $row['name'] . "\t";
        print $row['color'] . "\t";
        print $row['calories'] . "\n";
    }
}
/*输出结果
apple   red     150
banana  yellow  250
kiwi    brown   75
lemon   yellow  25
orange  orange  300
pear    green   150
watermelon      pink    90
*/

//mixed PDOStatement::fetch ([ int $fetch_style [, int $cursor_orientation = PDO::FETCH_ORI_NEXT [, int $cursor_offset = 0 ]]] )
//从一个 PDOStatement 对象相关的结果集中获取下一行。fetch_style 参数决定 POD 如何返回行。
//详见 菜鸟教程 https://www.runoob.com/php/pdostatement-fetch.html
//这个是重点

//array PDOStatement::fetchAll ([ int $fetch_style [, mixed $fetch_argument [, array $ctor_args = array() ]]] )
//返回一个包含结果集中所有行的数组
//详见 菜鸟教程 https://www.runoob.com/php/pdostatement-fetchall.html
//这个是重点
//使用此方法获取大结果集将导致系统负担加重且可能占用大量网络资源。可以考虑改用fetch()

//string PDO::lastInsertId ([ string $name = NULL ] )
//返回最后插入行的ID,或者是一个序列对象最后的值,取决于底层的驱动。比如,PDO_PGSQL() 要求为 name 参数指定序列对象的名称。
//注意: 在不同的 PDO 驱动之间,此方法可能不会返回一个有意义或一致的结果,因为底层数据库可能不支持自增字段或序列的概念。 
?>

事务管理

https://www.runoob.com/php/php-pdo-transactions.html

预处理语句

https://www.runoob.com/php/php-pdo-prepared-statements.html

https://www.runoob.com/php/pdostatement-execute.html

https://www.runoob.com/php/pdostatement-bindparam.html

https://www.runoob.com/php/pdostatement-bindvalue.html

MVC Pattern

是一种架构,不需要安装任何东西,没有新东西。

Laravel

简介

安装

下载并且运行 Composer-Setup.exe,它将安装最新版本的 Composer ,并设置好系统的环境变量,因此你可以在任何目录下直接使用 composer 命令。

//安装laravel
随便的目录>composer global require "laravel/installer"
//移到你要部署laravel的文件夹内
你的目录>laravel new helloApp
//测试运行
你的目录/helloApp>php artisan serve
//浏览器打开http://localhost:8000

文件结构

Unit Tests with PHP

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值