再次学PHP,有些东西看了之后还是像第一次看,说明这些知识很难记下来,把他们记下来以后再看。
PHP 变量作用域
在 PHP 中,可以在脚本的任意位置对变量进行声明。
变量的作用域指的是变量能够被引用/使用的那部分脚本。
PHP 有三种不同的变量作用域:
- local(局部)
- global(全局)
- static(静态)
Local 和 Global 作用域
函数之外声明的变量拥有 Global 作用域,只能在函数以外进行访问。
函数内部声明的变量拥有 LOCAL 作用域,只能在函数内部进行访问。
下面的例子测试了带有局部和全局作用域的变量:
<?php
$x=5; // 全局作用域
function myTest() {
$y=10; // 局部作用域
echo "<p>测试函数内部的变量:</p>";
echo "变量 x 是:$x";
echo "<br>";
echo "变量 y 是:$y";
}
myTest();
echo "<p>测试函数之外的变量:</p>";
echo "变量 x 是:$x";
echo "<br>";
echo "变量 y 是:$y";
?>
输出结果:
测试函数内部的变量:
变量 x 是:
变量 y 是:10
测试函数之外的变量:
变量 x 是:5
变量 y 是:
PHP global 关键词
global 关键词用于访问函数内的全局变量。
要做到这一点,请在(函数内部)变量前面使用 global 关键词:
<?php
$x=5;
$y=10;
function myTest() {
global $x,$y;
$y=$x+$y;
}
myTest();
echo $y; // 输出 15
?>
PHP 同时在名为 $GLOBALS[index] 的数组中存储了所有的全局变量。下标存有变量名。这个数组在函数内也可以访问,并能够用于直接更新全局变量。
上面的例子可以这样重写:
<?php
$x=5;
$y=10;
function myTest() {
$GLOBALS['y']=$GLOBALS['x']+$GLOBALS['y'];
}
myTest();
echo $y; // 输出 15
?>
PHP static 关键词
通常,当函数完成/执行后,会删除所有变量。不过,有时我需要不删除某个局部变量。实现这一点需要更进一步的工作。
要完成这一点,请在您首次声明变量时使用 static 关键词:
<?php function myTest() { static $x=0; echo $x; $x++; } myTest(); myTest(); myTest(); ?>
然后,每当函数被调用时,这个变量所存储的信息都是函数最后一次被调用时所包含的信息。
注释:该变量仍然是函数的局部变量。
PHP 默认参数值
<?php
function setHeight($minheight=50) {
echo "The height is : $minheight <br>";
}
setHeight(350);
setHeight(); // 将使用默认值 50
setHeight(135);
setHeight(80);
?>
匿名函数
<?php
$greet = function($name)
{
printf("Hello $name <br>");
};
$greet('World');
$greet('PHP');
?>
可变变量
$a = "hello";
$$a = "world"; // 等于变量 $hello
echo $hello;
可变函数
<?php
// 可变函数
function display() {
echo "hello world";
}
$var = "display";
echo $var(); // 等于display(),强制转换了
?>
数据类型转换
$var = "123";
$int = intval($var); // 字符转int
var_dump($int);
$float = floatval($var); // 字符转float
var_dump($float);
$bool = boolval($var); // 字符转bool
var_dump($bool);
获取数据类型 用 gettype 函数:
$type = gettype($bool);
echo $type;
在if判断时会自动转化为bool类型
$str = "str";
if (str) {
echo $str;
}
当变量为0时也会转为为true,这个很奇怪,和OC不一样,貌似只有变量为false时才不会执行if后的语句。
$str = 0;
if (str) {
echo $str;
}
判断数据类型(难理解的已经有注释)
is_bool($bool);
is_array($bool);
is_string($bool);
is_float($bool);
is_int($bool);
is_integer($bool);
is_object($bool);
is_resource($bool);
is_null($bool);
is_scalar($bool); // 判断一个变量的值是否是标量类型;
is_numeric($bool); // 检测变量是否为数字或数字字符串
文件包含:inlcude,include_once,require,require_once,将一个文件的内容包含进另外一个文件。
inlcude和require 使用一次包含一次
include_once 和 require_one 不管在一个脚本中包含另外一个脚本多次,都只加载一次。
路径表示方式:
../ 上级目录
./: 当前目录
/: 网站根目录
__DIR__ 当前文件目录(绝对目录) 嵌套包含应该采用绝对路径
include如果引入两个文件,都有一个相同的函数名,那么就会发生重定义的错误。使用include_once可以避免此错误,一般都_once用的比较多。应该根据实际情况需求include和_once的区别。
include和require区别
当要包含的文件不存在时,include产生一个警告(Warning),该语句后面的程序会继续执行;而 require则导致一个致命错误(Fatal error),程序就此终止。
include_once和require_once
应该用于在脚本执行期间同一个文件有可能被包含超过一次的情况下,想确保它只被包含一次以避免函数重定义,变量重新赋值等问题。
1.incluce在用到时加载,这个函式一般是放在流程控制的处理区段中
2.require在一开始就加载,这个函式通常放在 PHP 程式的最前面
3._once后缀表示已加载的不加载
终止脚本执行 return die exit
echo 'start';
return ;
return 'return';
exit('stop here');
exit;
die('stop here'); // die和exit效果一样
echo 'end';
字符串操作
$str = 'hello_world';
$sub_str = substr($str, 2,3); // 截取字符串并要求长度
echo $sub_str;
echo '<br>';
$sub_str2 = substr($str, 2); // 截取字符串
echo $sub_str2;
echo '<br>';
$toupper = strtoupper($str); // 大写
echo $toupper;
echo '<br>';
$tolower = strtolower($toupper); // 小写
echo $tolower;
echo '<br>';
$strres = strrev($str); // 反转字符串
echo $strres;
echo '<br>';
$strpos = strpos($str, 'l'); // 获取字符串中某个字符首次出现的位置
echo $strpos;
echo '<br>';
$strrpos = strripos($str, 'l'); // 获取字符串中某个字符首次出现的位置
echo $strrpos;
echo '<br>';
时间函数
$time = time(); // 时间戳
echo $time;
echo '<br>';
$date = date('Y-m-d H:i:s', 123); // 第一个参数是一个时间戳,如果没有默认是当前时间 1970-01-01:00:02:03
echo $date;
echo '<br>';
$date1 = date('Y-m-d H:i:s'); // 2017-03-14:09:42:26
echo $date1;
echo '<br>';
$time1 = strtotime($date1); // 转时间戳 $time1 和 $time 是相等的
echo $time1;
echo '<br>';
数学函数
$int = -1;
$abs_int = abs($int); // 绝对值
echo $abs_int;
echo '<br>';
$float = 1.1;
$floor = floor($float); // 向下取整
echo $floor;
echo '<br>';
$ceil = ceil($float); // 向上取整
echo $ceil;
echo '<br>';
$round = round($float);
echo $round;
echo '<br>';
$rand = rand(0, 100); // 取随机数 0-100
echo $rand;
echo '<br>';
$mt_rand = mt_rand(0, 1000); // 取随机数 0-100 效率更好
echo $mt_rand;
echo '<br>';
数组
$arr = array('mother','father','son'); // 同一数据类型,索引数组
var_dump($arr);
$arr2 = array('mother',35,1.65); // 不同数据类型
var_dump($arr2);
$arr3 = array('name'=> 'jobs','age' => 50); // 关联数组
$name = $arr3['name'];
$age = $arr3['age'];
var_dump($arr3);
var_dump($name);
var_dump($age);
$arr4['a'] = 'a';
$arr4[3] = 'b';
var_dump($arr4);
数组的遍历
// 遍历数组
for ($i = 0; $i < $length; $i++) {
$element = $arr[$i];
echo $element;
echo '<br>';
}
foreach ($arr as $key =>$value) {
echo $key;
echo '<br>';
echo $value;
echo '<br>';
}
$arr2 = array('name' => 'job', 'age' => 30);
reset($arr2); // 把内部指针移动到数组的首个元素
while (list($key, $val) = each($arr2)) {
echo "$key => $val<br>";
}
reset($arr2);
while ($each = each($arr2)) {
echo 'key = '.$each[0].' , '.'value = '.$each[1] . '<br>';
}
$person1 = array('name' => 'jobs');
$person2 = array('name' => 'tim');
$allPerson = array($person1,$person2);
var_dump($allPerson);
echo '<br>';
unset($allPerson[0]);
var_dump($allPerson);
echo '<br>';
foreach ($allPerson as $person) {
$name = $person['name'];
echo 'name = '.$name.'<br>';
}
$_POST 接受表单POST方式提交的数据
$_GET['age'] 取表单name等于age的数据
header('Refresh:3;url=get.php'); // 页面的跳转 参数是时间:秒 和 跳转的页面
复选框提交数据要用到数组的方式提交 name=hoppy[];
<input type="checkbox" name="hoppy[]" id="hoppy" value="1" />