1、脚本标签
<?php
// PHP 代码
?>
2、输出
有两种在浏览器输出文本的基础指令:echo 和 print
echo - 可以输出一个或多个字符串
print - 只允许输出一个字符串,返回值总为 1
echo 输出的速度比 print 快, echo 没有返回值,print有返回值1。
<?php
echo "<h2>PHP is fun!</h2>";
echo "Hello world!<br>";
echo "I'm about to learn PHP!<br>";
echo "This", " string", " was", " made", " with multiple parameters.";
?>
3、变量
以$开头,大小写敏感
<?php
$x=5;
$y=6;
$z=$x+$y;
echo $z;
?>
4、弱类型
弱类型,不必声明类型
5、常量
<1>(整个脚本中)自动全局
<2>没有$开头
<3>可以设置(常量名)大小写是否敏感
<?php
define("GREETING", "Hello World!");
echo GREETING;
?>
<?php
define("GREETING", "Hello World", true);
echo greeting;
?>
<4>在函数内直接引用常量,不需要像变量那么麻烦
<!DOCTYPE html>
<html>
<body>
<?php
define("GREETING", "Hello World!");
function test()
{
echo GREETING;//可以正常输出
}
test();
?>
</body>
</html>
<5>函数外可以直接引用函数内定义的常量
<!DOCTYPE html>
<html>
<body>
<?php
function test()
{
define("GREETING", "Hello World!");
}
test();
echo GREETING;//正常输出
?>
</body>
</html>
6、变量作用域
<1>函数内不能直接访问全局变量
<?php
$x=5; // 全局变量
function myTest()
{
$y=10; // 局部变量
echo "<p>测试函数内变量:<p>";
echo "变量 x 为: $x"; //这样的方法访问不到全局的$x,所以这里输出为空
echo "<br>";
echo "变量 y 为: $y";
}
myTest();
echo "<p>测试函数外变量:<p>";
echo "变量 x 为: $x";
echo "<br>";
echo "变量 y 为: $y";
?>
<2>使用$GLOBAL可以在函数内访问全局变量
<?php
$x=5;
$y=10;
function myTest()
{
$GLOBALS['y']=$GLOBALS['x']+$GLOBALS['y'];
}
myTest();
echo $y;//15
?>
<3>static作用域
定义在函数内的变量,每次调用完都是清空的,但是加了static他就可以保存住
<?php
function myTest()
{
static $x=0;
echo $x;
$x++;
}
myTest(); //0
myTest(); //1
myTest(); //2
?>
对于全局变量来说,有没有static没有差别
<?php
static $x=0;
function myTest()
{
echo $GLOBALS['x'];
$GLOBALS['x']++;
}
myTest(); //0
myTest(); //1
myTest(); //2
?>
对一个局部变量来说,加了static并不会改变他的作用域
<?php
function myTest()
{
static $x = 0;
echo $x;
$x++;
}
echo $x;//注意,这里会提示此变量未定义
myTest();
myTest();
myTest();
?>
7、数据类型
String(字符串), Integer(整型), Float(浮点型), Boolean(布尔型), Array(数组), Object(对象), NULL(空值)
可以说一个Array搞定一切
<1>整型
<?php
$x = 5985;
var_dump($x);
echo "<br>";
$x = -345; // 负数
var_dump($x);
echo "<br>";
$x = 0x8C; // 十六进制数
var_dump($x);
echo "<br>";
$x = 047; // 八进制数
var_dump($x);
?>
<2>浮点型
<?php
$x = 10.365;
var_dump($x);
echo "<br>";
$x = 2.4e3;
var_dump($x);
echo "<br>";
$x = 8E-5;
var_dump($x);
?>
<3>布尔型
$x=true;
$y=false;
<4>数组
<?php
$cars=array("Volvo","BMW","Toyota");
var_dump($cars);
?>
-数组里面可以是键值对,还可以用"+"将两个数组连接成一个数组
<!DOCTYPE html>
<html>
<body>
<?php
$x = array("a" => "red", "b" => "green");
$y = array("c" => "blue", "d" => "yellow");
$z=$x+$y;
echo $z['a'];
$x['a']="black";
echo "<br>";
echo $z['a'];//red
echo "<br>";
echo $x['a'];//black
?>
</body>
</html>
可以看到这个$z已经把所有元素复制过去,而非仅仅是一个引用,改变了原数组的元素,并不会改变$z的元素。
-count可以返回数组长度
<?php
$cars=array("Volvo","BMW","Toyota");
echo count($cars);
?>
-遍历数组
<?php
$cars=array("Volvo","BMW","Toyota");
$arrlength=count($cars);
for($x=0;$x<$arrlength;$x++)
{
echo $cars[$x];
echo "<br>";
}
?>
-关联数组(键值对)
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");//创建方法1
//创建方法2
$age['Peter']="35";
$age['Ben']="37";
$age['Joe']="43";
<?php
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
echo "Peter is " . $age['Peter'] . " years old.";
?>
-遍历关联数组
<?php
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
foreach($age as $myKey=>$myValue)
{
echo "Key=" . $myKey . ", Value=" . $myValue;
echo "<br>";
}
?>
<?php
class Car
{
var $color;
function Car($color="green") {
$this->color = $color;
}
function what_color() {
return $this->color;
}
}
?>
<6>NULL
<?php
$x="Hello world!";
$x=null;
var_dump($x);
?>
8、运算符
<1>三元运算符
<?php
$test = '菜鸟教程';
// 普通写法
$username = isset($test) ? $test : 'nobody';//isset判断bool值,string是否已赋值
echo $username, PHP_EOL;
// PHP 5.3+ 版本写法
$username = $test ?$test."hello": 'nobody';
//$username = $test ?: 'nobody';//也可以这样省略
echo $username, PHP_EOL;//PHP_EOL是换行符
?>
9、数组排序
<1>sort()升序排列
<?php
$cars=array("Volvo","BMW","Toyota");
sort($cars);
echo "$cars[0]";//BMW,字母小的排前面
?>
<?php
$numbers=array(4,6,2,22,11);
sort($numbers);
echo "$numbers[0]";//2,数值小的排前面
?>
<2>rsort()降序排列
<3>asort()根据值升序排列
<4>ksort()根据键升序排列
<5>arsort()根据值降序排列
<6>krsort()根据键降序排列
<7>数组倒转(顺序反过来):
$orders = array_reverse($orders);
10、超级全局变量
<1>$GLOBALS
用来引用全局变量
<2>$_SERVER
<?php
echo $_SERVER['PHP_SELF'];//当前脚本的文件名
echo "<br>";
echo $_SERVER['SERVER_NAME'];//主机名(域名)
echo "<br>";
echo $_SERVER['HTTP_HOST'];//请求头中host的内容
echo "<br>";
echo $_SERVER['HTTP_REFERER'];//引导用户代理到当前页的前一页的地址(该值不可信)
echo "<br>";
echo $_SERVER['HTTP_USER_AGENT'];//
echo "<br>";
echo $_SERVER['SCRIPT_NAME'];//包含当前脚本的路径
?>
<3>$_REQUEST
用于收集HTML表单提交的数据
<4>$_POST
收集表单数据
<5>$_GET
11、面向对象,成员函数调用(->)
<?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;
}
}
$runoob = new Site('www.runoob.com', '菜鸟教程');
$taobao = new Site('www.taobao.com', '淘宝');
$google = new Site('www.google.com', 'Google 搜索');
// 调用成员函数,获取标题和URL
$runoob->getTitle();
$taobao->getTitle();
$google->getTitle();
$runoob->getUrl();
$taobao->getUrl();
$google->getUrl();
?>
12、代码的引用
include、require、use
include、require:相当于把代码包含进来,就是那个引用的文件把这一行代码代替了,这个要包含的文件 必须是<?php?>包含的,路径最好用正斜杠
include如果找不到会报一个警告然后继续执行,require则会报错误并且停止执行,如果是系统配置,缺少了不能允许,则我们应该用require
include_once、require_once:加了once之后,系统会判断,如果已经添加了,则不会添加第二次,但是系统做这个判断效率会降低,因此应该尽量靠系统架构使其不会重复加载,然后代码上面尽量不要用once影响效率
use:相当于java的import
a.php
<?php
$a++;
?>
b.php
<?php
$a=5;
require_once("a.php");
echo $a;//6
require_once("a.php");
echo $a;//6,如果用了require则为7,因为他不管有没有加载过都会再次加载
?>
13、单引号与双引号
单引号不解释(直接输出),双引号会经过解释
14、ceil的使用
// 测试实例如下:
$total1 = 40;
echo 'page_num1='.ceil($total1/30);//2
$total2 = 30;
echo 'page_num2='.ceil($total2/30);//1
$total3 = 20;
echo 'page_num3='.ceil($total3/30);//1
$total4 = 0;
echo 'page_num4='.ceil($total4/30);//0
15、字符串相关
<0>strlen
<?php
echo strlen("Hello world!");
?>
<1>mb_strlen
上面提到的strlen函数计算字符串长度的时候,并非完美。
当字符串里面含有中文的时候,如果是utf-8格式的,每个中文将会计算为3个字符。
因此我们需要另一个统计函数,这个统计函数每个中文只统计为1。
$length = mb_strlen($item_name,'utf8');
<2>mb_substr
截取字符串,配合mb_strlen使用,第一个参数是原字符串,第二个参数是起始位置(从0开始),第三个参数是截取的长度,第四个参数是编码。
$str = mb_substr($item_name,0,10,'utf8');
<3>strpos查找子字符串
-strpos()返回一段字符串在另一个字符串中的index
<?php
echo strpos("Hello world!","world");
?>
查找在给定字符串内有没有存在某子字符串,如果有则返回其第一次出现的位置,如果没有则返回false
使用方法:
if (strpos($from,$find) === false)
{
// 这里是找不到
}else
{
// 这里是找到了
}
<4>strstr根据分隔符截取
$str1 = strstr($from,$find,true);// 返回分隔符之前的部分,不包含分隔符
$str2 = strstr($from,$find);// 返回分隔符之后的部分,包含分隔符
<5>substr根据index截取
$str = substr($fromSku2,1);// 从第2个字符开始截取
<6>防止数字变为科学计数法
$orderId = number_format($orderId,0,'','');
<7>获取链接的包含扩展名的文件名
$name = basename($imgUrl);
<8>分割字符串返回数组
$skuArr = mb_split('\s','hello world');
Array (
[0] => hello
[1] => world
)
<9>strripos查找字符串在另一个字符串中最后一次出现的位置
$str = 'https://product.suning.com/0070152707/10042045173.html';
$find = '/';
$index = strripos($str,$find,0);
exit('test='.$index);//37
注意:如果是找不到则返回false
16、isset
判断一个变量是否存在。
比如,当一个json解析之后,我们要看其中一个字段是否存在,比如这个请求返回的是正确还是错误,如果返回正确,那么字段里面没有'error';如果返回错误,返回的字段里面有'error',我们不能直接:
if($obj->{'error'} == null)
{
exit('返回错误');
}else
{
exit('返回正确');
}
这样判断是不行的,当对象里面没有error的时候,你这样访问页面要报错,正确的方法是:
if(isset($obj->{'error'}))
{
exit('返回错误');
}else
{
exit('返回正确');
}