学习php前,应当对html和css有简单的基础了解,可以参考: HTML和CSS简单学习整理。安装环境的话windows可以参考: PHP——学前知识储备与环境选择。不过这里笔者是以linux为学习环境,linux的环境搭建参考: 从入坑到不放弃-----centos7系统软件安装方法及网站环境搭建。 本博文的重点在于语法学习和PHP表单,文件的处理
PHP基础语法(理解)
语法部分参考于菜鸟教程:https://www.runoob.com/php/php-syntax.html
PHP 脚本可以放在文档中的任何位置。 PHP 中的每个代码行都必须以分号结束。分号是一种分隔符,用于把指令集区分开来。 通过 PHP,有两种在浏览器输出文本的基础指令:echo 和 print。
PHP变量
<?php
$x=1;
$y=2;
$z=$x+$y;
echo $z;
?>
PHP 变量规则: 变量以 $ 符号开始,后面跟着变量的名称 变量名必须以字母或者下划线字符开始 变量名只能包含字母数字字符以及下划线(A-z、0-9 和 _ ) 变量名不能包含空格 变量名是区分大小写的($y 和 $Y 是两个不同的变量)
PHP global 关键字
global 关键字用于函数内访问全局变量
<?php
$x=1;
$y=2;
function myTest()
{
global $x,$y;
$y=$x+$y;
}
myTest();
echo $y;
?>
Static 作用域
当一个函数完成时,它的所有变量通常都会被删除。如果希望某个局部变量不要被删除,请在第一次声明变量时使用 static 关键字
<?php
function myTest()
{
static $x=0;
echo $x;
$x++;
echo PHP_EOL;
}
myTest();
myTest();
myTest();
?>
echo 语句
<?php
$test1="冰冰雪聪明";
$test2="胖头鱼";
$bingbing=array("孩怕","咕咕","哒咩");
echo $test1;
echo "<br>";
echo "冰冰说 $test2 好吃";
echo "<br>";
echo "我有一点 {$bingbing[0]}";
?>
PHP 定界符 EOF PHP EOF是一种在命令行 shell 和程序语言里定义一个字符串的方法。 EOF 可以用任意其它字符代替,只需保证结束标识与开始标识一致。
<?php
$name="bingbing";
$a= <<<EOF
"wang"$name
"123456789"
EOF;
echo $a;
?>
整型
<?php
$x = 6666;
var_dump($x);
echo "<br>";
$x = -1;
var_dump($x);
echo "<br>";
$x = 0x2C;
var_dump($x);
echo "<br>";
$x = 035;
var_dump($x);
?>
浮点型
<?php
$x = 3.1415926;
var_dump($x);
echo "<br>";
$x = 1.1e2;
var_dump($x);
echo "<br>";
$x = 2E-5;
var_dump($x);
?>
NULL 值 NULL 值表示变量没有值。NULL 是数据类型为 NULL 的值。
<html>
<body>
<?php
$x="Hello world!";
$x=null;
var_dump($x);
?>
</body>
</html>
类型比较
松散比较:使用两个等号 == 比较,只比较值,不比较类型。 严格比较:用三个等号 === 比较,除了比较值,也比较类型。
常量
<?php
define("BINGBING", "不愧是我王冰冰");
function myTest()
{
echo BINGBING;
}
myTest();
?>
字符串变量
<?php
$txt="Hello world!";
echo $txt;
?>
<?php
echo strlen("Hello world!");
?>
<?php
echo strpos("Hello world!","world");
?>
数组
<?php
$bingbing=array("i","love","bingbing");
echo $bingbing[0] . " " . $bingbing[1] . " " . $bingbing[2] . ".";
?>
<?php
$bingbing=array("i ","love","bingbing");
echo count($bingbing);
?>
关联数组
<?php
$age=array("bingbing"=>"18","Ben"=>"37","Joe"=>"43");
echo "bingbing is " . $age['bingbing'] . " years old.";
?>
遍历关联数组
<?php
$age=array("bingbing"=>"18","xiaolang"=>"100","makabaka"=>"20");
foreach($age as $x=>$x_value)
{
echo "name=" . $x . ", old=" . $x_value;
echo "<br>";
}
?>
数组排序 参考链接:https://www.runoob.com/php/php-ref-array.html
sort() - 对数组进行升序排列 rsort() - 对数组进行降序排列 asort() - 根据关联数组的值,对数组进行升序排列 ksort() - 根据关联数组的键,对数组进行升序排列 arsort() - 根据关联数组的值,对数组进行降序排列 krsort() - 根据关联数组的键,对数组进行降序排列
<?php
$bingbing=array("c","b","a");
sort($bingbing);
print_r($bingbing);
?>
<?php
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
asort($age);
print_r($age);
?>
<?php
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
arsort($age);
?>
超级全局变量 $GLOBALS
<?php
$x = 1;
$y = 2;
function addition()
{
$GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y'];
}
addition();
echo $z;
?>
$_REQUEST 用于收集HTML表单提交的数据。
<!DOCTYPE html>
<html>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="fname">
<input type="submit">
</form>
<?php
$name = htmlspecialchars($_REQUEST['fname']);
echo $name;
?>
</body>
</html>
更多参考:https://www.runoob.com/php/php-superglobals.html
PHP实现冒泡排序
<?php
$arr = array(3,1,4,1,5,9,2,6);
for($i = count($arr)-1;$i>=0;$i--)
{
for($j = 0 ; $j < $i ; $j++)
{
if($arr[$j+1] > $arr[$j] )
{
$aa = $arr[$j+1];
$arr[$j+1] = $arr[$j];
$arr[$j] = $aa;
}
}
}
print_r($arr);
?>
运行结果: 函数 在 PHP 中,提供了超过 1000 个内建的函数,参考连接:https://www.runoob.com/php/php-ref-array.html
<?php
function writeName($fname,$punctuation)
{
echo $fname . " 皮卡皮卡" . $punctuation . "<br>";
}
echo "她的名字是 :";
writeName("冰冰",".");
echo "她的另一个名字 : ";
writeName("胖头鱼","!");
echo "她还有一个名字是 :";
writeName("吃花椒的喵酱","!!!");
?>
返回值
<?php
function add($x,$y)
{
$total=$x+$y;
return $total;
}
echo "1 + 2 = " . add(1,2);
?>
命名空间 参考链接:https://www.php.net/manual/zh/language.namespaces.rationale.php 命名空间一个最明确的目的就是解决重名问题,命名空间将代码划分出不同的空间,每个空间的常量、函数、类的名字互不影响, 类似于‘封装’的概念。
<?php
namespace MyProject {
const CONNECT_OK = 1;
class Connection { }
function connect() { }
}
namespace AnotherProject {
const CONNECT_OK = 1;
class Connection { }
function connect() { }
}
?>
<?php
namespace MyProject {
const CONNECT_OK = 1;
class Connection { }
function connect() { }
}
namespace {
session_start();
$a = MyProject\connect();
echo MyProject\Connection::start();
}
?>
子命名空间
<?php
namespace MyProject\Sub\Level;
const CONNECT_OK = 1;
class Connection { }
function Connect() { }
?>
命名空间使用
<?php
namespace Foo\Bar\subnamespace;
const FOO = 1;
function foo() {}
class foo
{
static function staticmethod() {}
}
?>
<?php
namespace Foo\Bar;
include 'file1.php';
const FOO = 2;
function foo() {}
class foo
{
static function staticmethod() {}
}
foo();
foo::staticmethod();
echo FOO;
subnamespace\foo();
subnamespace\foo::staticmethod();
echo subnamespace\FOO;
\Foo\Bar\foo();
\Foo\Bar\foo::staticmethod();
echo \Foo\Bar\FOO;
?>
命名空间和动态语言特征 PHP 命名空间的实现受到其语言自身的动态特征的影响,所以要动态访问命名部分的元素。 example1.php 文件代码:
<?php
class classname
{
function __construct()
{
echo __METHOD__,"\n";
}
}
function funcname()
{
echo __FUNCTION__,"\n";
}
const constname = "global";
$a = 'classname';
$obj = new $a;
$b = 'funcname';
$b();
echo constant('constname'), "\n";
?>
动态访问命名空间的元素
<?php
namespace namespacename;
class classname
{
function __construct()
{
echo __METHOD__,"\n";
}
}
function funcname()
{
echo __FUNCTION__,"\n";
}
const constname = "namespaced";
include 'example1.php';
$a = 'classname';
$obj = new $a;
$b = 'funcname';
$b();
echo constant('constname'), "\n";
$a = '\namespacename\classname';
$obj = new $a;
$a = 'namespacename\classname';
$obj = new $a;
$b = 'namespacename\funcname';
$b();
$b = '\namespacename\funcname';
$b();
echo constant('\namespacename\constname'), "\n";
echo constant('namespacename\constname'), "\n";
?>
别名/导入 PHP 命名空间支持 有两种使用别名或导入方式:为类名称使用别名,或为命名空间名称使用别名,在PHP中,别名是通过操作符 use 来实现的。
<?php
namespace foo;
use My\Full\Classname as Another;
use My\Full\NSname;
use \ArrayObject;
$obj = new namespace\Another;
$obj = new Another;
NSname\subns\func();
$a = new ArrayObject(array(1));
?>
<?php
use My\Full\Classname as Another, My\Full\NSname;
$obj = new Another;
NSname\subns\func();
?>
<?php
use My\Full\Classname as Another, My\Full\NSname;
$obj = new Another;
$a = 'Another';
$obj = new $a;
?>
<?php
use My\Full\Classname as Another, My\Full\NSname;
$obj = new Another;
$obj = new \Another;
$obj = new Another\thing;
$obj = new \Another\thing;
?>
后备全局函数/常量
<?php
namespace A\B\C;
class Exception extends \Exception {}
$a = new Exception('hi');
$b = new \Exception('hi');
$c = new ArrayObject;
?>
<?php
namespace A\B\C;
const E_ERROR = 45;
function strlen($str)
{
return \strlen($str) - 1;
}
echo E_ERROR, "\n";
echo INI_ALL, "\n";
echo strlen('hi'), "\n";
if (is_array('hi')) {
echo "is array\n";
} else {
echo "is not array\n";
}
?>
全局空间
<?php
namespace A\B\C;
function fopen() {
$f = \fopen(...);
return $f;
}
?>
面向对象
<?php
class Site {
var $url;
var $title;
function setUrl($par){
$this->url = $par;
}
function getUrl(){
echo $this->url . PHP_EOL;
}
function setTitle($par){
$this->title = $par;
}
function getTitle(){
echo $this->title . PHP_EOL;
}
}
$bingbing = new Site;
$gugu = new Site;
$xiaolang = new Site;
$bingbing->setTitle( "冰冰" );
$gugu->setTitle( "咕咕" );
$xiaolang->setTitle( "小狼" );
$bingbing->setUrl( 'www.bingbing.com' );
$gugu->setUrl( 'www.gugu.com' );
$xiaolang->setUrl( 'www.xiaolang.com' );
$bingbing->getTitle();
$gugu->getTitle();
$xiaolang->getTitle();
$bingbing->getUrl();
$gugu->getUrl();
$xiaolang->getUrl();
?>
运行结果 构造函数
<?php
class Site {
var $url;
var $title;
function __construct( $par1, $par2 ) {
$this->url = $par1;
$this->title = $par2;
}
function setUrl($par){
$this->url = $par;
}
function getUrl(){
echo $this->url . PHP_EOL;
}
function setTitle($par){
$this->title = $par;
}
function getTitle(){
echo $this->title . PHP_EOL;
}
}
$bingbing= new Site('www.bingbing.com', '冰冰');
$gugu = new Site('www.gugu.com', '咕咕');
$xiaolang = new Site('www.xiaolang.com', '小狼');
$bingbing->getTitle();
$gugu->getTitle();
$xiaolang->getTitle();
$bingbing->getUrl();
$gugu->getUrl();
$xiaolang->getUrl();
?>
继承 PHP 使用关键字 extends 来继承一个类,PHP 不支持多继承
<?php
class Child_Site extends Site {
var $category;
function setCate($par){
$this->category = $par;
}
function getCate(){
echo $this->category . PHP_EOL;
}
}
抽象类 任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。
<?php
abstract class AbstractClass
{
abstract protected function prefixName($name);
}
class ConcreteClass extends AbstractClass
{
public function prefixName($name, $separator = ".") {
if ($name == "Pacman") {
$prefix = "Mr";
} elseif ($name == "Pacwoman") {
$prefix = "Mrs";
} else {
$prefix = "";
}
return "{$prefix}{$separator} {$name}";
}
}
$class = new ConcreteClass;
echo $class->prefixName("Pacman"), "\n";
echo $class->prefixName("Pacwoman"), "\n";
?>
Static 关键字 声明类属性或方法为 static(静态),就可以不实例化类而直接访问,静态属性不可以由对象通过 -> 操作符来访问。
<?php
class Foo {
public static $my_static = 'foo';
public function staticValue() {
return self::$my_static;
}
}
print Foo::$my_static . PHP_EOL;
$foo = new Foo();
print $foo->staticValue() . PHP_EOL;
?>
PHP表单和文件(重点)
FORM表单 HTML表单(Form)是网站的一个重要组成部分,主要用于采集和提交用户输入的信息,表单采集数据后将数据发送至服务器,如用户填写完信息后执行提交操作,将表单中的数据从客户端的浏览器传送到服务器端,数据在服务器端经过PHP程序进行处理后,再将用户所需要的信息传递回客户端的浏览器上,从而完成一次页面交互。
我们在linux中创建一个留言板
<html>
<head>
<title>post form</title>
</head>
<body>
<form action="post.php" method="POST">
<p>username : </p>
<input type="text" name="user"></input>
<p>password : </p>
<input type="password" name="pass"></input>
<br>
<input type="submit" value="submit">
</form>
<body>
</html>
我们再写一个PHP去处理我们存进去的数据,这里我们使用的是post提交数据,没有选择使用get来储存数据,因为使用get的话,我们的数据输入进去后,他会出现在我们的上方的地址栏之中,没有达到保护隐私的目的,所以我们使用post提交数据,使用get请求数据。
<?php
$username = $_POST['user'];
$password = $_POST['pass'];
echo $username;
echo $password;
?>
当我们输入数据后,就会发现在.php文件里存储了我们的数据
使用POST方法时,HTTP会将表单的输入信息进行包装后发送,不依赖于URL。 所有提交的信息都在后台传输,用户在浏览器端是看不到这一过程的,安全性高。 POST方法不会将传递的参数值显示在地址栏中,并且对用户数据的长度没有限制。 POST方法比较适合用于发送一些保密的或者较大量的数据到服务器。
对于我们上面的这个十分简单的表单,其实有一个很大的问题,就是我们用户如果输入空的信息改怎么办,就是当密码或用户名为空时,我们如何执行操作。 我们写一个判断用户名或密码是否为空的代码 (标准的写法比这复杂的多,这里我想了一个很简单的写法,有点不标准,但是很容易理解):
<?php
if(empty($_POST['user']))
{
echo "<script>alert('请输入用户名!');windows.history.back(-1);</script>";
}
else
{
$username = $_POST['user'];
echo $username;
}
if(empty($_POST['pass']))
{
echo "<script>alert('请输入密码!');windows.history.back(-1);</script>";
}
else
{
$password = $_POST['pass'];
echo $password;
}
?>
当我们再次输入时,如果输入的数据为空: GET方法和POST方法的对比
GET
- get方式在url后面拼接参数
2.只能以文本的形式传递数据 3.传递的数据量小,4KB左右 4.安全性低,会将数据显示在地址栏 5.速度快,通常用于对安全性要求不高的请求
POST 1.安全性较高 2.传递数据量大,请求对数据长度没有要求 3.请求不会被缓存,也不会保留在浏览器历史记录中
文件 1.PHP可对服务器端的文件或文件夹进行操作。 2.对文件的操作包括创建文本文件、写入文本文件、读取文本文件等。 3.对文件夹的操作包括创建、复制、移动或删除文件夹等。
更多的函数希望大家自己用到的时候查阅,这里写了最基础常用的,参考链接:https://www.runoob.com/php/php-ref-filesystem.html
打开文件: fopen( ) 打开文件。 文件读取︰ fread( ) 读取指定长度的字符串。 fgets( ) 读取文件一行内容。 feof( ) 检测是否已到达文件末尾。 文件写入∶ fwrite( ) 函数来写入数据。 关闭文件: fclose( ) 关闭文件。
fopen() 用于在 PHP 中打开文件
<html>
<body>
<?php
$file=fopen("welcome.txt","r");
?>
</body>
</html>
fclose()
<?php
$file = fopen("test.txt","r");
fclose($file);
?>
feof()
if (feof($file)) echo "文件结尾";
fgets()
<?php
$file = fopen("welcome.txt", "r") or exit("无法打开文件!");
while(!feof($file))
{
echo fgets($file). "<br>";
}
fclose($file);
?>
fgetc()
<?php
$file=fopen("welcome.txt","r") or exit("无法打开文件!");
while (!feof($file))
{
echo fgetc($file);
}
fclose($file);
?>
fwrite()
fwrite(file,string,length)
file_get_contents()
file_get_contents(path,include_path,context,start,max_length)
<?php
echo file_get_contents("test.txt");
?>
copy() copy() 函数复制文件。
copy(file,to_file)
<?php
echo copy("source.txt","target.txt");
?>
filesize() filesize() 函数返回指定文件的大小。如果成功,该函数返回文件大小的字节数。如果失败,则返回 FALSE。
filesize(filename)
<?php
echo filesize("test.txt");
?>
file_put_contents() file_put_contents() 函数把一个字符串写入文件中。
int file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource $context ]] )
<?php
echo file_put_contents("sites.txt","bingbing");
?>
<?php
$file = 'sites.txt';
$site = "\ngugu";
file_put_contents($file, $site, FILE_APPEND | LOCK_EX);
?>
unlink() unlink() 函数删除文件。如果成功,该函数返回 TRUE。如果失败,则返回 FALSE。
unlink(filename,context)
<?php
$file = "test.txt";
if (!unlink($file))
{
echo ("Error deleting $file");
}
else
{
echo ("Deleted $file");
}
?>
fileatime() fileatime() 函数返回指定文件的上次访问时间。
fileatime(filename)
<?php
echo fileatime("test.txt");
echo "<br />";
echo "Last access: ".date("F d Y H:i:s.",fileatime("test.txt"));
?>
filectime() filectime() 函数返回指定文件的上次修改时间。
filectime(filename)
<?php
echo filectime("test.txt");
echo "<br />";
echo "Last change: ".date("F d Y H:i:s.",filectime("test.txt"));
?>
pathinfo() pathinfo() 函数以数组的形式返回关于文件路径的信息。
pathinfo(path,options)
<?php
print_r(pathinfo("/testweb/test.txt"));
?>
最最简单的留言板(初初级)
使用PHP完成前后端两部分,编写一个最最简单的留言板模型,后期我们学习完 mysql 之后再进一步优化我们的留言板模型,这里我们先只使用PHP完成模型的搭建。
我们写一个最基础的前端部分:
<html>
<head>
<title>liuyanban</title>
</head>
<body>
<form action="action.php" method="POST">
<p>title:</p>
<input type="text" name="title"></input>
<p>content :</p>
<textarea cols=60 rows=15 name="content">说点神马吧</textarea>
<br>
<input type="submit" value="提交"></input>
</form>
</body>
</html>
然后我们提交数据后,我们再写一个最简单的后端部分来处理数据:
<?php
if(empty($_POST['title']))
{
echo '<script>alert("我的心是冰冰的");windows.history.back(-1);</script>';
return false;
}
else
{
$title = $_POST['title'];
$content = $_POST['content'];
$filename = 'liuyanban.txt';
$data = 'title : '.$title.'<br> '.'content :'.$content.'<br>';
$write = file_put_contents($filename, $data, FILE_APPEND);
if($write)
{
echo '<script>alert("不愧是我王冰冰");</script>';
}
else
{
echo '<script>alert("你她喵是不是故意找茬?");</script>';
}
echo file_get_contents($filename);
}
?>
然后我们的留言板雏形就出现了,然后我们可以发现我们的留言内容: 但是我们发现别人的留言板是这样的: 就是留完言后,我们能否将留言内容显示在前端的界面,而不是跑到php代码里面显示去了,这里我们只使用PHP实现这个功能:
[root@localhost liuyan]
//我们把liuyanban.html的信息复制到liuyanban.php里面去
然后我们把php代码放到html里面
<html>
<head>
<title>liuyanban</title>
</head>
<body>
<form action="" method="POST" >//这里就不再写action.php了
<p>title:</p>
<input type="text" name="title"></input>
<p>content :</p>
<textarea cols=60 rows=15 name="content">说点神马吧</textarea>
<br>
<input type="submit" value="提交"></input>
</form>
</body>
</html>
<?php
if(empty($_POST['title']))
{
echo '<script>alert("我的心是冰冰的");windows.history.back(-1);</script>';
return false;
}
else
{
$title = $_POST['title'];
$content = $_POST['content'];
$filename = 'liuyanban.txt';
$data = 'title : '.$title.'<br> '.'content :'.$content.'<br>';
$write = file_put_contents($filename, $data, FILE_APPEND);
if($write)
{
echo '<script>alert("不愧是我王冰冰");</script>';
}
else
{
echo '<script>alert("你她喵是不是故意找茬?");</script>';
}
echo file_get_contents($filename);
}
?>
这个留言板还有一个问题就是在刚访问的时候,会弹出一个判断title是否为空的情况,而且界面很丑,只有留言的功能,后面再优化改进。
错误记录 描述 :在html和php代码分开处理时,只能运行出 “我的心是冰冰的” 和 “你她喵是不是故意找茬” 这两个情况,“不愧是我王冰冰” 的情况不知道为什么不出来。 环境: centos7, PHP版本为5.4.16,apache。 解决思路: 初次考虑是代码写错了,后来问了一些人,发现应该是没问题,再次考虑为权限不够,给对应的文件足够权限后,依旧无法解决问题,重启相应的服务,也无法解决问题,最后在搜索引擎的不断搜索下,找到了解决方案,问题出现在防火墙。 解决方案:
setenforce 0 //centos终端root权限下输入命令,临时关闭selinux防火墙可以成功。
最难的不是算法,而是bug。
|