PHP基础

Posted 远书

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP基础相关的知识,希望对你有一定的参考价值。

一、php函数:有参 无参
    function FunctionName($value=‘‘) //函数名的命名方法:驼峰法,每个单词首字母大写
    {
      # code...
    }
  调用函数时,函数名(),注意如果需要给参数,则需要在()中输入参数,个数要满足其要求
  需要在函数中有返回值,需要使用return

二、PHP面向对象:
  (C 面向过程,C++、C#、Java、php、python等面向对象}
  对象:对于某些事物的一种描述,代表整体上的一种概念,对现实世界的一种抽象,具有行为、形态、表示三种特性
三、面向对象中常用的概念:
  1、类:对某类事物的抽象,它包含事物的形态、行为等。

    class ClassName extends AnotherClass
    {          //定义类的变量和函数
      function __construct(argument) //构造函数,自动帮助我们去赋值
      {
        # code...
      }
    }

  2、对象:是类的实例,人类(亚洲人对象)、狗类(二哈对象)

    创建对象:new 对象,类的实例化,使用new

<?php
/**
 *     
 */
class people
{
    var $name;
    var $home="beijing ";
    function run()
    {
        echo "I can run!";
    }
}    
$xiaoming=new people;
echo $xiaoming->home;
echo "

";
$xiaoming->run();
?>

  3、成员变量:对象的属性特征 二哈:外形像狼

    调用成员方法及属性:->

<?php
/**
 * 
 */
class people
{
    var $name;
    var $home="beijing ";
    function run()
    {
        echo $this->name;
    }
}
$xiaoming=new people;
$xiaoming->name="zhang xiangming";
$xiaoming->run();
?>

  4、成员函数:对象的某种行为 二哈:拆家

    this 表示当前类,类中有变量和函数,要使用这些变量和函数,$this->变量 或者 $this->函数

  5、构造函数:主要用来创建对象时初始化对象,为成员变量赋初始值,也意味着在new对象的时用到该函数,该函数需要定义在类中
    在new对象的时候,构造函数会自动帮助我们去给类中变量赋值
    function __construct(参数){ }

<?php
/**
* 
 */
class site 
{
    var $link;
    var $title;
    function __construct($parameter1,$parameter2)
    {
        $this->link=$parameter1;
        $this->title=$parameter2;
    }
    function SetLink($para)
    {
        $this->link=$para;
    }
    function PrintLink()
    {
        echo $this->link;
    }
    function SetTitle($para)
    {
        $this->title=$para;
    }
    function PrintTitle()
    {
        echo $this->title;
    }
}
$para1 = new site("www.baidu.com","百度");
$para1->PrintLink();
$para1->PrintTitle();

$para1->SetLink("ichunqiu.com");
$para1->PrintLink();
?>

  6、析构函数:和构造函数相反,当对象使用完之后,会自动执行析构函数把对象销毁
    function __destruct(){ }

四、继承

  在PHP中可以使用extends继承一个类,不能继承多个(使用其他类中的变量和函数,这个类叫作父类) A(1 2 3) class B extends A{ },A是B的父类,B继承A,B可以使用A中的变量和函数,B也叫做子类
  方法重写:覆盖,也就是说父类中的方法不能满足自身的需要,重新去定义方法

五、访问控制

  对定义的类中变量和方法进行访问控制,通过public/protected/private实现
    public:公有的,在任何地方均可使用
    protected:受保护的,只能在父类、子类以及自身类中去使用
    private:私有的,只能被其定义的类中访问

变量的访问控制

<?php
/**
 * 
 */
class myclass 
{
    public $public = "Public";
    protected $protected = "Protected";
    private $private = "Private";
    function print_hallo()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}

$obj = new myclass;
$obj->print_hallo();
echo $obj->public;
echo $obj->protected;  //此行会产生错误
echo $obj->private;   //此行会产生错误
/**
 * 
 */
class new_mycalss extends myclass
{
    
    function print_hallo1()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;   //此行会产生错误
    }
}
$obj2 = new new_mycalss;
$obj2->print_hallo1();

函数的访问控制

<?php
class MyClass
{
    // 声明一个公有的构造函数
    public function __construct() { }
     // 声明一个公有的方法
    public function MyPublic() { echo "public‘s function"."
";}
     // 声明一个受保护的方法
    protected function MyProtected() { echo "protected‘s function"."
"; }
     // 声明一个私有的方法
    private function MyPrivate() {echo "private‘s function"."
"; }
     // 此方法为公有
    public function Foo()
    {
        $this->MyPublic();
        $this->MyProtected();
        $this->MyPrivate();
    }
}
 $myclass = new MyClass;
$myclass->MyPublic(); // 这行能被正常执行
$myclass->MyProtected(); // 这行会产生一个致命错误
$myclass->MyPrivate(); // 这行会产生一个致命错误
$myclass->Foo(); // 公有,受保护,私有都可以执行


 /**
 * Define MyClass2
 */
class MyClass2 extends MyClass
{
    // 此方法为公有
    function Foo2()
    {
        $this->MyPublic();//没问题
        $this->MyProtected();//没问题
        $this->MyPrivate(); // 这行会产生一个致命错误
    }
}
$myclass2 = new MyClass2;
$myclass2->MyPublic(); // 这行能被正常执行
$myclass2->Foo2(); // 公有的和受保护的都可执行,但私有的不行
 class Bar 
{
    public function test() {
        $this->testPrivate();
        $this->testPublic();
    }
     public function testPublic() {
        echo "Bar::testPublic
";
    }
    
    private function testPrivate() {
        echo "Bar::testPrivate
";
    }
}
 class Foo extends Bar 
{
    public function testPublic() {
        echo "Foo::testPublic
";
    }
    
    private function testPrivate() {
        echo "Foo::testPrivate
";
    }
}
$myFoo = new foo();
$myFoo->test(); // Bar::testPrivate 
                // Foo::testPublic
?>

六、接口

  指定类中必须使用的哪些方法,这些类不需要具体去定义,使用interface去定义接口,接口中只需要写清楚函数的名称以及参数即可但是使用几口的时候需要使用关键词:implements,注意:类中必须要实现所有的方法。类中可以实现多个接口,接口之间使用“,”隔开。

<?php

interface iTemplate
{
    public function setVariable($name,$var);
    public function gethtml($template);
}
interface iT2{
    public function echoVari($vari);
}

//实现接口
class Template implements iTemplate,iT2
{
    private $vars = array();
    public function echoVari($vari)
    {
        echo $vari;
    }
    public function setVariable($name,$var)
    {
        $this->vars[$name] = $var;
    }
    public function getHtml($template)
    {
        foreach ($this->vars as $name => $value) {
            $template = str_replace($name, $value, $template);
        }
        return $template;
    }
}
$te=new Template();
$te->setVariable("test","1");
echo $te->getHtml("{test}");

七、表单处理:
  服务器接受用户发过来的数据的方式:
    $_GET 接收用户以GET方式发送的数据
    $_POST 接收用户以POST方式发送的数据
    $_COOKIE 接收用户的cookie
    $_REQUEST 接收用户发过来的数据(GET、POST)
  实体化编码htmlspecialchars()

    echo htmlspecialchars("<script></script>");//&lt;script&gt;&lt;/script&gt;gt;

  is_array() 判断参数是否为数组,如果是数组,则返回true
  isset() 判断结果是否为空,如果非空(null),则返回true

八、文件包含

  通过一些文件包含的函数将本地或者服务器中文件包含解析到当前 中,达到文件读取、代码利用、函数调用等目的。
    include “文件名”==include(“文件名”)
    include_once 去包含文件时,后者需要包含一次即可,当找不到包含的文件时,会警告(PHP Warning),后续代码依旧会执行
    require
    require_once 包含文件时,后者需要包含一次即可,当找不到包含的文件时,会直接报错,后续代码不执行。
  包含过来文件文件中,只要文件中代码是标准格式PHP代码就会被解析,如果里面的内容不是PHP代码,就会把内容显示出来。包含的文件路径写法:可以是相对路径,也可以是绝对路径
    注意:读文件时要注意需要的权限

    copy good.png/b+shell.php/a bad.png (Windows本地生成图片马)

      good.png是一个正常图片 /b 表示比特流文件
      shell.php 是木马文件或者含有php代码的文件,后缀名不做要求,主要是ASCII文件即可 /a 表示ASCII文件
      bad.png 生成的图片马

九、会话管理
  1、会话:服务器和用户之间传输数据的方式或者途径,在通道传输数据之前需要建立通道,这个通道可以理解为会话,在客户端通过cookie来管理会话,在服务端通过session来管理会话。

  2、cookie的管理,首先需要服务器给用户分发cookie数据,setcookie(name,value,表达式,路径,与范围),后三者可不写,其中表达式主要用来设置cookie的时效性。注意:setcookie需要写在HTML代码之前。
  服务器获取cookie:¥_COOKIE["cookie的名字"],注意:需要使用当前打开的浏览器去访问,不能换用其他的浏览器
  删除cookie:setcookie("loginInfo","",time()-3600),通过服务器去删除

<?php 
if($_POST[‘name‘]==‘admin‘ and $_POST[‘password‘]==‘admin‘){
    $value = "my cookie value";
    //setcookie("loginString",$value);
    //参数说明第一个参数指定cookie的标识符key
    //第二个参数指定cookie的值
    //第三个参数指定cookie生存期
    //第四个参数指定,该cookie的作用域,将在Cookie上可用的服务器上的路径。
    //如果设置为“/”,cookie将在整个域中可用。如果设置为‘/fo/‘,
    //cookie将只在/fo/Directory和所有子目录(如/Fo/Bar /域)中可用。
    //默认值是正在设置Cookie的当前目录。
    //第五个参数,domain,对哪个域设置一个cookie
    //第六个参数规定是否通过安全的 HTTPS 连接来传输 cookie
    //第七个参数用于指定,该cookie的属性是否是http-only,意思是无法通过js代码来获取cookie值
    setcookie("loginString",$value,0,"/","localhost",false,true);
    header("Location: http://localhost/cookie/view.php");
    //echo "login ok";
}
else{
    //echo "登录信息有误";
    //sleep(3);
    header("Location:http://localhost/cookie/index.html");
}
?>

  3、session的管理,工作机制:为用户创建唯一的uid,在该uid的基础上储存变量,uid放在cookie或者通过URL去传输(相比较,后者很不安全)
  在HTML代码之前通过session_start() 开启(必须放在HTML代码之前,意味着在/tmp目录下会生成session文件,格式:sess_uid,uid是32位的),开启之后可以通过session[] 数组存储某些变量
  销毁session方式(和session_start()一起使用):unset() session_

<?php 
session_start();
//$_SESSION = array();
if($_POST[‘name‘]==‘admin‘ and $_POST[‘password‘]==‘admin‘){
    $_SESSION[‘sessionid‘]= time();
    header("Location: http://localhost/session/view.php");
    //echo $_SESSION[‘sessionid‘]."<br/>";
    //echo "login ok";
}
?>

  4、head()向用户的浏览器发送HTTP报头
  设置编码方式
    echo "<meta charset=‘utf-8‘>"
    head("Content-Type:text/html;charset=utf-8")

  设置跳转
    head("Location:http://www.hacker.com") 

十、文件上传

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <meta charset="utf-8">
</head>
<body>
    <form action="up.php" method="post" enctype="multipart/form-data">
        <!-- enctype 规定表单使用哪种内容类型  -->
        <label for="file" >文件名:</label>
        <input type="file" name="filename" id="file">
        <input type="submit" name="提交">
    </form>

</body>
</html>

 

<?php
header("Content-type:text/html;charset:utf-8");
if ($_FILES["filename"]["error"]) {
    echo $_FILES["filename"]["error"];
} else {
    //白名单
    $array = array(‘png‘,"gif","jpeg","jpg","bmp");

/*    echo "文件名:".$_FILES["filename"]["name"]."<br>";
    echo "类型:".$_FILES["filename"]["type"]."<br>";
    echo "大小::".$_FILES["filename"]["size"]."<br>";
    echo "临时位置:".$_FILES["filename"]["tmp_name"]."<br>";
    echo "文件后缀名:".@end(explode(".", $_FILES["filename"]["name"]))."<br>";
    //explode(标识,字符串),按照标识将字符串分割为数组
    //explode(".","test.te.png") == array("test","te","png")
    //end(数组)取出数组中最后一个值*/
    $fileEndName=@end(explode(".", $_FILES["filename"]["name"]));
    if (in_array($fileEndName, $array)) { //在数组中匹配要找的内容,如果有,则返回true
        if (!file_exists("uploads/".$_FILES["filename"]["name"])) {   
        //检测文件或者目录是否存在,如果存在,则返回true
            echo "可以上传"."<br>";
            move_uploaded_file($_FILES["filename"]["tmp_name"], "uploads/".$_FILES["filename"]["name"]);    //filename:临时文件位置;destination:目的位置。将临时文件拷贝到目标位置
            echo "文件上传成功,位置在:"."uploads/".$_FILES["filename"]["name"];
        }
        else {
            echo "有同名文件";
        }
    } else {
        echo "不许上传";
    }
}

十一、文件管理:文件的打开、关闭、读取、写入
  fopen(打开文件的位置~文件路径和文件名~,打开文件的方式)
    r 只读方式去打开
    r+ 读和写
    w 之一写的方式打开,如果文件不存在,则创建文件
    w++ 读和写,如果文件不存在,则创建文件
    a 文件末尾追加,如果文件不存在,则创建文件
    a++ 读和追加,如果文件不存在,则创建文件
  fclose(句柄~打开的文件对应的句柄~) 关闭文件
  fread(打开的文件,读取大小~单位是字节~) 读取指定大小的文件内容
  feof() 检测是否到达文件的末尾,如果没有到达文件的末尾,则返回值是false
  fgets() 读取单行数据内容,只有一个参数,如果需要将整个文档中的内容都读出来,则使用feof+fgets循环去读
  fgetc() 逐个字符去读

<?php
$file=fopen("1.php", "r") or exit("unable open this file!");
while (!feof($file)) {
echo fgets($file);
}

  file() 将整个文档中数据读取到数组中,一行对应一个单元
  file_get_contents() 将整个文档中数据读取到字符串中
  file_put_contents(文件名,数据) 写数据,覆盖原数据,如果文件名不存在,则创建该文件
  basename() 获取文件名
  dirname() 获取文件路径
  copy(源文件,目标文件) 复制文件
  unlink() unset() 删除文件

十二、命令执行函数,通过php中某些函数去执行系统命令,
  system()
  exec() 执行系统命令,没有返回值
  shell_exec()
  echo ` 命令 `
  passthru()
   等等

十三、代码执行函数,使用PHP的某些函数去执行字符串类型的PHP代码,注意:PHP代码
  evel()
  assert() 代码中的分号可以不要
  preg_replace(正则表达式,替换的字符,被替换的字符),注意:如果执行代码

    preg_replace("/test/e", "echo ‘123‘", "test icq");

  等等

以上是关于PHP基础的主要内容,如果未能解决你的问题,请参考以下文章

PHP代码-psysh调试代码片段工具

超实用的php代码片段

比较有用的php代码片段

php Yoast SEO规范输出的代码片段

php Yoast SEO规范输出的代码片段

使用 NodeJS 和 JSDOM/jQuery 从代码片段构建 PHP 页面