PHP基础回顾(一)

PHP 能做什么?
PHP 可以生成动态页面内容
PHP 可以创建、打开、读取、写入、关闭服务器上的文件
PHP 可以收集表单数据
PHP 可以发送和接收 cookies
PHP 可以添加、删除、修改您的数据库中的数据
PHP 可以限制用户访问您的网站上的一些页面
PHP 可以加密数据
通过 PHP,您不再限于输出 HTML。您可以输出图像、PDF 文件,甚至 Flash 电影。您还可以输出任意的文本,比如 XHTML 和 XML。


为什么使用 PHP?

  • PHP 可在不同的平台上运行(Windows、Linux、Unix、Mac OS X 等)
  • PHP 与目前几乎所有的正在被使用的服务器相兼容(Apache、IIS 等)
  • PHP 提供了广泛的数据库支持
  • PHP 是免费的,可从官方的 PHP 资源下载它: www.php.net
  • PHP 易于学习,并可高效地运行在服务器端

PHP 变量
与代数类似,可以给 PHP 变量赋予某个值(x=5)或者表达式(z=x+y)。变量可以是很短的名称(如 x 和 y)或者更具描述性的名称(如 age、carname、totalvolume)。
PHP 变量规则:

  • 变量以$符号开始,后面跟着变量的名称
  • 变量名必须以字母或者下划线字符开始
  • 变量名只能包含字母数字字符以及下划线(A-z、0-9 和 _ )
  • 变量名不能包含空格
  • 变量名是区分大小写的($y 和 $Y 是两个不同的变量)

PHP 是一门弱类型语言

PHP 变量作用域
变量的作用域是脚本中变量可被引用使用的部分。
PHP 有四种不同的变量作用域:
local
global
static
parameter

PHP global 关键字
global 关键字用于函数内访问全局变量。在函数内调用函数外定义的全局变量,我们需要在函数中的变量前加上 global 关键字。PHP 将所有全局变量存储在一个名为$GLOBALS[index] 的数组中。 index 保存变量的名称。这个数组可以在函数内部访问,也可以直接用来更新全局变量。

  function myTest()
{
    global $x,$y;
    $y=$x+$y;
}

  function myTest()
{
  $GLOBALS['y']=$GLOBALS['x']+$GLOBALS['y'];
} 

static 关键字
当一个函数完成时,它的所有变量通常都会被删除。然而,有时候您希望某个局部变量不要被删除。要做到这一点,请在您第一次声明变量时使用 static 关键字。

echo 和 print 区别:
echo - 可以输出一个或多个字符串
print - 只允许输出一个字符串,返回值总为 1
提示:echo 输出的速度比 print 快, echo 没有返回值,print有返回值1。

**数组
var_dump() 函数返回数组的数据类型和值

 <?php 
$cars=array("Volvo","BMW","Toyota");
var_dump($cars);
?>

对象
使用class关键字声明类对象。类是可以包含属性和方法的结构。

  <?php
    class Car
  {
  var $color;
  function __construct($color="green") {
    $this->color = $color;
  }
  function what_color() {
    return $this->color;
  }
}
?>

常量

<?php
define("GREETING", "欢迎访问 Runoob.com");
function myTest() {
echo GREETING;
} 
myTest();    // 输出 "欢迎访问 Runoob.com"
?>

字符串连接
并置运算符 (.) 用于把两个字符串值连接起来。

PHP strlen() 函数
strlen() 函数返回字符串的长度(字符数)。

 <?php
  echo strlen("Hello world!");
?> 

PHP strpos() 函数
strpos() 函数用于在字符串内查找一个字符或一段指定的文本。如果在字符串中找到匹配,该函数会返回第一个匹配的字符位置。如果未找到匹配,则返回 FALSE。

 <?php
  echo strpos("Hello world!","world");
 ?> 

遍历数组for循环

<?php
$cars=array("Volvo","BMW","Toyota");
$arrlength=count($cars); 
for($x=0;$x<$arrlength;$x++)
{
    echo $cars[$x];
    echo "<br>";
}
?>

遍历关联数组foreach

<?php
    $age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
foreach($age as $x=>$x_value)
{
    echo "Key=" . $x . ", Value=" . $x_value;
    echo "<br>";
}
?>

数组排序(冒泡排序)
PHP 数组排序函数
sort() - 对数组进行升序排列
rsort() - 对数组进行降序排列
asort() - 根据关联数组的值,对数组进行升序排列
ksort() - 根据关联数组的键,对数组进行升序排列
arsort() - 根据关联数组的值,对数组进行降序排列
krsort() - 根据关联数组的键,对数组进行降序排列

<?php
// 从大到小排序。冒泡排序。
$numArray =array(3,2,6,5,8,10);
$numCount = count($numArray);
for($i=$numCount-1;$i>=0;$i--){
    for($j=0;$j<$i;$j++){
        if($numArray[$j]< $numArray[$j+1]){
            $aa = $numArray[$j+1];
            $numArray[$j+1]=$numArray[$j];
            $numArray[$j]=$aa;
        }
    }
}
print_r($numArray);
?>

超级全局变量
PHP中预定义了几个超级全局变(superglobals) ,这意味着它们在一个脚本的全部作用域中都可用。 不需要特别说明,就可以在函数及类中使用。PHP 超级全局变量列表:
$GLOBALS $_SERVER
$_REQUEST
$_POST
$_GET
$_FILES
$_ENV
$_COOKIE
$_SESSION

PHP $GLOBALS
$GLOBALS 是PHP的一个超级全局变量组,在一个PHP脚本的全部作用域中都可以访问。$GLOBALS 是一个包含了全部变量的全局组合数组。变量的名字就是数组的键。

<?php 
$x = 75; 
$y = 25; 
function addition() 
{ 
    $GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y']; 
} 
addition(); 
echo $z; 
?>

PHP $_SERVER
$_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建。不能保证每个服务器都提供全部项目;服务器可能会忽略一些,或者提供一些没有在这里列举出来的项目。

<?php 
echo $_SERVER['PHP_SELF'];
echo "<br>";
echo $_SERVER['SERVER_NAME'];
echo "<br>";
echo $_SERVER['HTTP_HOST'];
echo "<br>";
echo $_SERVER['HTTP_REFERER'];
echo "<br>";
echo $_SERVER['HTTP_USER_AGENT'];
echo "<br>";
echo $_SERVER['SCRIPT_NAME'];
?>

PHP $_REQUEST
PHP $_REQUEST 用于收集HTML表单提交的数据。用户通过点击 "Submit" 按钮提交表单数据时, 表单数据将发送至<form>标签中 action 属性中指定的脚本文件。 然后,我们可以使用超级全局变量 $_REQUEST 来收集表单中的 input 字段数据(通过$_REQUES[' ']拿到表单提交的数据):

<html>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="fname">
<input type="submit">
</form>
<?php
$name = $_REQUEST['fname'];
echo $name;
?>
</body>
</html>

PHP $_POST
PHP $_POST 被广泛应用于收集表单数据,在HTML form标签的指定该属性:"method="post"。用户通过点击 "Submit" 按钮提交表单数据时, 表单数据将发送至<form>标签中 action 属性中指定的脚本文件

PHP $_GET
PHP $_GET 同样被广泛应用于收集表单数据,在HTML form标签的指定该属性:"method="get"。
$_GET 也可以收集URL中发送的数据。

foreach 循环

 <?php
$x=array("one","two","three");
foreach ($x as $value)
{
echo $value . "<br>";
}
?>

PHP 魔术常量
PHP 向它运行的任何脚本提供了大量的预定义常量。不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。有八个魔术常量它们的值随着它们在代码中的位置改变而改变。例如 _LINE_ 的值就依赖于它在脚本中所处的行来决定。这些特殊的常量不区分大小写,如下:

  • _LINE_文件中的当前行号。
  • _FILE_文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。
  • _DIR_文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。它等价于 dirname(_FILE_)。除非是根目录,否则目录中名不包括末尾的斜杠。
  • _FUNCTION_函数名称
  • _CLASS_类的名称
  • _TRAIT_代码复用的一个方法,称为 traits(相当于java中继承,继承父类的方法,以及重写父类的方法等)。
<?php
class Base {
    public function sayHello() {
        echo 'Hello ';
    }
} 
trait SayWorld {
    public function sayHello() {
        parent::sayHello();
        echo 'World!';
    }
}
class MyHelloWorld extends Base {
    use SayWorld;
}
$o = new MyHelloWorld();
$o->sayHello();
?>
//输出Hello World!
  • _METHOD_类的方法名。返回该方法被定义时的名字(区分大小写)。
  • _NAMESPACE_当前命名空间的名称(区分大小写)。此常量是在编译时定义的

PHP 命名空间(namespace)
PHP 命名空间可以解决以下两类问题:

  • 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
  • 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。
  • 命名空间通过关键字namespace 来声明
  • 在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句。所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前
  • 与目录和文件的关系很像,PHP 命名空间也允许指定层次化的命名空间的名称。

PHP 面向对象(类比java)

  • PHP 类定义:class Site(){…}
  • PHP 中创建对象:$runoob = new Site;
  • 调用成员方法:$runoob->getUrl();
  • PHP 构造函数:void __construct (){…}
  • 析构函数:对象结束其生命周期时系统自动执行析构函数。
    function __destruct() {
    print "销毁 " . $this->name . "\n";
    }
  • 继承:
    class Child extends Parent {…}
  • 方法重写:对父类的方法进行改写覆盖override)
  • 访问控制:关键字 public,protected或 private
  • 接口:用interface指定,其类用implements实现。接口像定义一个标准的类一样,但其中定义所有的方法都是空的。
  • 常量:定义和使用常量的时候不需要使用 $ 符号
  • 抽象类:
    1、至少有一个方法是被声明为抽象的
    2、不能被实例化
    3、继承(extend)一个抽象类的时候,子类必须定义父类中的所有抽象方法
  • Static 关键字:
    1、声明类属性或方法为 static(静态),就可以不实例化类而直接访问。静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。
    2、由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。
    3、静态属性不可以由对象通过 -> 操作符来访问。
  • Final 关键字:父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承
  • 调用父类构造方法:需要在子类的构造方法中调用 parent::__construct()
    <?php
    class BaseClass {
    function __construct() {
    print "BaseClass 类中构造方法" . PHP_EOL;
    }
    }
    class SubClass extends BaseClass {
    function __construct() {
    parent::__construct(); // 子类构造方法不能自动调用父类的构造方法
    print "SubClass 类中构造方法" . PHP_EOL;
    }
    }
    // 调用 BaseClass 构造方法
    $obj = new BaseClass();
    // 调用 BaseClass、SubClass 构造方法
    $obj = new SubClass();
    // 调用 BaseClass 构造方法
    $obj = new OtherSubClass();
    ?>
    输出结果为:
    BaseClass 类中构造方法
    BaseClass 类中构造方法
    SubClass 类中构造方法
    BaseClass 类中构造方法
    (方法中,变量 $this 代表自身的对象。PHP_EOL 为换行符。可以用一个变量来动态调用类)

include 和 require 的区别

  • require 一般放在 PHP 文件的最前面,程序在执行前就会先导入要引用的文件;
  • include 一般放在程序的流程控制中,当程序执行时碰到才会引用,简化程序的执行流程。
  • require 引入的文件有错误时,执行会中断,并返回一个致命错误;
  • include 引入的文件有错误时,会继续执行,并返回一个警告。

PHP 文件处理

  • 打开文件:$file=fopen("welcome.txt","r");
  • 关闭文件:fclose($file);
  • 检测文件末尾(EOF):if (feof($file)) echo "文件结尾";
  • 逐行读取文件:echo fgets($file). "<br>";
  • 逐字符读取文件: echo fgetc($file);

PHP 文件上传

// 供上传文件的 HTML 表单
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>
<form action="upload_file.php" method="post"         enctype="multipart/form-data">
    <label for="file">文件名:</label>
<input type="file" name="file" id="file"><br>
<input type="submit" name="submit" value="提交">
</form>
</body>
</html>

//创建上传脚本文件
<?php
if (\$_FILES["file"]["error"] > 0)
{
    echo "错误:" . $_FILES["file"]["error"] . "<br>";
}
else
{
    echo "上传文件名: " . \$_FILES["file"]["name"] . "<br>";
    echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
    echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
    echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"];
}
?>
  • <form> 标签的 enctype 属性规定了在提交表单时要使用哪种内容类型。在表单需要二进制数据时,比如文件内容,请使用 "multipart/form-data"。
  • <input> 标签的 type="file" 属性规定了应该把输入作为文件来处理。举例来说,当在浏览器中预览时,会看到输入框旁边有一个浏览按钮。
  • 通过使用 PHP 的全局数组 $_FILES,你可以从客户计算机向远程服务器上传文件。第一个参数是表单的 input name,第二个下标可以是 "name"、"type"、"size"、"tmp_name" 或 "error"。如下所示:
    $_FILES["file"]["name"] - 上传文件的名称
    $_FILES["file"]["type"] - 上传文件的类型
    $_FILES["file"]["size"] - 上传文件的大小,以字节计
    $_FILES["file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称
    $_FILES["file"]["error"] - 由文件上传导致的错误代码

保存被上传的文件
上面的实例在服务器的 PHP 临时文件夹中创建了一个被上传文件的临时副本。这个临时的副本文件会在脚本结束时消失。要保存被上传的文件,我们需要把它拷贝到另外的位置。

    <?php
// 允许上传的图片后缀
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
echo $_FILES["file"]["size"];
$extension = end($temp);     // 获取文件后缀名
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 204800)   // 小于 200 kb
&& in_array($extension, $allowedExts))
{
    if ($_FILES["file"]["error"] > 0)
    {
        echo "错误:: " . $_FILES["file"]["error"] . "<br>";
    }
    else
        {
        echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
        echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
        echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
        echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"] .         "<br>";
    
        // 判断当期目录下的 upload 目录是否存在该文件
        // 如果没有 upload 目录,你需要创建它,upload 目录权限为     777
        if (file_exists("upload/" . $_FILES["file"]["name"]))
        {
              echo $_FILES["file"]["name"] . " 文件已经存在。 ";
      }
        else
      {
        // 如果 upload 目录不存在该文件则将文件上传到 upload 目录    下
        move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
         echo "文件存储在: " . "upload/" . $_FILES["file"]["name"];
        }
    }
}
else
{
    echo "非法的文件格式";
}
?>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,875评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,569评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,475评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,459评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,537评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,563评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,580评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,326评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,773评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,086评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,252评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,921评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,566评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,190评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,435评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,129评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,125评论 2 352