PHP 基本知识
PHP 数组操作
关联数组:
<?php
$var = array("first"=>1,"second"=>2,"third"=>3,"montd"=>4);
foreach ($var as $key => $value) {
echo "键 --> {$key} --> 值 --> {$value} <br>";
}
echo "访问second = ". $var['second'] . "<br>";
print_r($var);
?>
二维数组:
<?php
$var1 = array(
"书籍" => array("文学","历史","地理"),
"水果" => array(1=>"苹果",2=>"橙子",3=>"水蜜桃")
);
print_r($var1);
?>
数组遍历:
<form name="from" method="post">
<input type="text" name="username" id="username" />
<input type="text" name="password" id="password" />
<input type="submit" name="submit" value="登录" />
</form>
<?php
while(list($name,$value)=each($_POST)){
if($name != "submit"){
echo "{$name} = {$value} <br>";
}
}
?>
将字符串转为数组: 通过使用explode函数可以将指定字符串分割并转换为数组,例如输入1*2*3*4
<form name="from" method="post">
<textarea name="content" id="content" cols="30" rows="5"></textarea>
<input type="submit" name="submit" value="提交" />
</form>
<?php
if(isset($_POST['submit']) && $_POST['submit'] != ""){
$content = $_POST['content'];
$data = explode("*", $content);
while(list($key,$value)=each($data)){
echo '<input type="checkbox" name="checkbox" value="checkbox">';
echo $value . "<br>";
}
}
?>
查询数组中指定元素:
<?php
$uid = "1@2@3@4@5";
$name = "admin@lyshark@guest@localhost@system";
$array_uid = explode("@", $uid);
$array_name = explode("@", $name);
# 在 array_uid 数组中找3并返回数组序号
$search = array_search("3", $array_uid);
$array_name[$search] = "lyshark"; # 通过序号修改元素
?>
<table border="1">
<tr>
<td>ID</td> <td>名称</td>
</tr>
<?php for( $i=0; $i<count($array_uid); $i++ ){ ?>
<tr>
<td><?php echo $array_uid[$i]; ?></td>
<td><?php echo $array_name[$i]; ?></td>
</tr>
<?php } ?>
</table>
数组创建/添加/去重:
<?php
$name = "admin@lyshark@guest@localhost@system";
$array_name = explode("@", $name);
$var = array_pop($array_name);
echo "获取到数组最后一个元素:" . $var . "<br>";
array_push($array_name, "array"); # 向数组中添加元素
print_r($array_name);
$array_name[] = "张三"; # 同上也可以实现追加
print_r($array_name);
$result = array_unique($array_name); # 实现数组去重
print_r($result);
?>
数组元素的添加和删除:
<?php
$var = array("python","php","C","java");
print_r($var);echo "<br>";
array_unshift($var, "perl"); # 在数组头部添加元素
print_r($var);echo "<br>";
array_push($var, "golang"); # 在数组尾部添加元素
print_r($var);echo "<br>";
array_shift($var); # 删除数组第一个元素
print_r($var);echo "<br>";
array_pop($var); # 删除数组最后一个元素
print_r($var);echo "<br>";
?>
数组与字符串相互转换:
<?php
$var = array("python","php","C","java");
print_r($var);echo "<br>";
$var = implode(",", $var); # 数组转换为字符串,以逗号隔开
print_r($var);echo "<br>";
$var = explode(",", $var); # 相反
print_r($var);echo "<br>";
$var1 = array("proc","mariadb");
$new = array_merge($var,$var1); # 两个字符串合并
print_r($new);
?>
判断键是否在数组中:
<?php
$var = array("python","php","C","java");
if(in_array("php", $var)){
echo "PHP in array";
}
?>
其他键值对互转:
<?php
$var = array("a"=>"python","b"=>"php","c"=>"C","d"=>"java");
$var1 = array("1"=>"a","2"=>"b","3"=>"c","4"=>"d");
# 值作为新数组的键
$new = array_combine($var, $var1);
print_r($new);echo"<br>";
# extrace()将数组转换成标量变量
extract($var);
echo $a."<br>";
echo $b."<br>";
# array_keys()和array_values() 取出键值对
print_r(array_keys($var));
print_r(array_values($var));
?>
Session 会话
设置Cookie: 设置一个cookie并且自动60秒后过期.
<?php
if(!isset($_COOKIE['visit_time'])){ # 检测cookie是否存在
setcookie("visit_time",date("y-m-d H:i:s")); # 不能存在将设置cookie
echo "第一次访问,设置cookie";
}else{
$OldData = date("y-m-d H:i:s");
setcookie("visit_time",date("y-m-d H:i:s"),time()+60); # 设置60秒自动过期
echo "您的cookie 时间:" . $_COOKIE['visit_time'] . "<br>";
}
?>
使用session会话
<?php
session_start(); # 启动会话
$_SESSION['admin'] = "lyshark"; # 设置sesion
if(!empty($_SESSION['admin'])){ # 判断session是否存在
$MySession = $_SESSION['admin']; # 存在则打印
echo "Session 值:" . $MySession;
}
unset($_SESSION['admin']); # 删除会话
$_SESSION = array("admin","guest"); # 注销多个会话
session_destroy(); # 清空当前会话
?>
设置Session失效时间
<?php
$time = 1*60;
session_set_cookie_params($time);
session_start();
$_SESSION['admin'] = "lyshark";
?>
setcookie设置session
<?php
session_start();
$time = 1 * 60;
setcookie(session_name(),session_id(),time()+$time,"/");
$_SESSION['admin'] = "lyshark";
?>
PHP 面向对象
定义简单的类:
<?php
class SportObj{
function Persion($name,$height,$age,$sex)
{
if($height >= 180 and $age >= 18)
{
return $name . " 符合要求!";
}else
{
return $name . " 不符合要求!";
}
}
}
$temp = new SportObj();
echo $temp->Persion("lyshark","180","20","男");
?>
定义不同属性的成员变量:
<?php
class SportObj{
public $username = "admin";
private $password = "123123";
protected $type = 0;
function Persion($name,$height,$age,$sex)
{
if($height >= 180 and $age >= 18)
{
return $name . " 符合要求!";
}else
{
return $name . " 不符合要求!";
}
}
}
$temp = new SportObj();
echo "公有属性可以被外部调用:" . $temp->username . "<br>";
echo $temp->Persion("lyshark","180","20","男");
?>
获取当前类名:
<?php
class persion{
public function exam(){
if(isset($this)){
echo "当前类名 = ". get_class($this);
}else{
echo "this 未定义.";
}
}
}
$class_name = new persion();
$class_name->exam();
?>
新常量覆盖旧常量:
<?php
class persion{
const NAME = "lyshark";
public function __construct(){
echo "当前姓名:" . persion::NAME;
}
}
class per extends persion{
const NAME="alex";
public function __construct(){
parent::__construct(); # 调用父类构造方法
echo "新的姓名:" . self::NAME;
}
}
$class_name = new per();
?>
类常量定义与调用:
<?php
class Books{
const BOOK_TYPE = " < PHP开发从入门到入土> "; # 声明常量
public $obj_name;
function setObjName($name){
$this->obj_name = $name;
}
function getObjName(){
return $this->obj_name;
}
}
$c_book = new Books();
$c_book->setObjName("PHP 类图书");
echo "输出内部常量:" . Books::BOOK_TYPE . "<br>";
echo "输出类名:" . $c_book->getObjName();
?>
构造方法与析构方法:
<?php
class Books{
public $obj_name;
public $obj_type;
public function __construct($name,$type){
# 构造方法
$this->obj_name = $name;
$this->obj_type = $type;
echo "默认自动执行构造方法" . "<br>";
}
public function __destruct(){
echo "函数执行完成之后清理工作" . "<br>";
}
public function boolObj(){
if ($this->obj_type == "1" and $this->obj_name == "lyshark"){
return $this->obj_name;
}else{
return "-1";
}
}
}
$c_book = new Books("lyshark","1");
echo $c_book->boolObj() . "<br>";
?>
面向对象继承: 子类继承父类的所有成员变量和方法包括构造方法,当子类被创建时PHP会先在子类中查找构造方法,如果子类有自己的构造方法,那么PHP会率先调用子类的方法,当子类没有时,PHP则会调用父类的构造方法,这就是PHP中的继承.
<?php
# 创建父类,或者说基类
class BaseObj{
public $name;
public $age;
public $sex;
public function __construct($name,$age,$sex){
$this->name = $name;
$this->age = $age;
$this->sex = $sex;
}
public function showMe(){
echo "这句话不会显示." . "<br>";
}
public function extenShow(){
echo "hello world";
}
}
# 子类继承父类的所有方法
class BeatBask extends BaseObj{
public $height;
public function __construct($name,$height){
$this->height = $height;
$this->name = $name;
}
public function showMe(){
if($this->height >= 100)
{
return $this->name . ", 符合条件!";
}else{
return $this->name . ", 不符合条件!";
}
}
}
# 子类继承父类的所有方法
class Lifting extends BaseObj{
public function ShowName(){
return $this->name;
}
}
$persion = new BeatBask("lyshark","199");
echo $persion->showMe() . "<br>"; # 默认调用子类的方法
echo $persion->extenShow() . "<br>"; # 继承父类可以调用public的子类
$persion_1 = new Lifting("lyshark","199","1");
echo "来自基类的变量:" . $persion_1->ShowName();
?>
面向对象多态(重载): 重载指一个标识符被多个函数名,且能够通过函数的参数个数或参数类型将这些同名函数区分开来,调用不发生混淆,其好处是可实现代码重用,不用为了对不同参数类型或参数个数而写多个函数.
多个函数使用同一个名字,但参数个数参数数据类型不同,调用时虽然方法名相同但根据参数个数或参数的数据类型不同而调整调用不同的函数,这就是重载.
<?php
class persion{
# __call = 根据参数调用函数(匿名函数调用)
public function __call($name,$argc){
echo "调用方法名称: " . $name . "<br>";
echo "参数存在个数: " .count($argc) . "<br>";
if(count($argc) == 1){
echo $this->display_list1($x);
}
if(count($argc) == 2){
echo $this->display_list2($x,$y);
}
}
public function display_list1($a){
return "调用了 display_list1 函数";
}
public function display_list2($a,$b){
return "调用了 display_list2 函数";
}
}
$per = new persion();
$per->List_Show(1,2);
?>
私有成员与函数: public修饰的函数与变量可以在任何地方被调用,而private修饰的函数只能在本类中被调用子类不可调用,而protected修饰的则可以在本类和子类中被调用但不可以在外部调用.
<?php
class persion{
private $name = "lyshark";
public function setName($name){
$this->name = $name;
}
private function getbool(){
echo "只能本类内部使用.";
}
public function getName(){
$this->getbool();
return $this->name;
}
}
$per = new persion();
$per->setName("abcde");
echo "获取变量:" . $per->getName();
?>
final 最终类: 被final修饰过的类和方法就是最终版,说明该类既不可被继承,也不能再有子类派生类.
<?php
final class SportObj{
public function __construct(){
echo "初始化构造方法.";
}
}
class MyBook extends SportObj{
public function exam(){
echo "MyBook 函数执行了.";
}
}
# 报错了,无法被继承
$var = new MyBook();
$var->exam();
?>
abstract 抽象类: 该类是一种不能被实例化的类,只能作为其他类的基类来使用,且该类无法被直接被调用.
<?php
# 定义抽象类
abstract class PersionObj{
# 定义抽象方法
abstract function service($getName,$Price,$num);
}
# 定义子类MyBook 并继承抽象类PersionObj
class MyBook extends PersionObj{
# 必须重写父类的方法,否则报错
public function service($getName,$Price,$num){
echo "书名:" . $getName . "<br>";
echo "价格:" . $Price . "<br>";
}
}
$var = new MyBook();
$var->service("《PHP 抽象类》",22,12);
?>
interface 接口: PHP 中类的继承只能单继承,如果需要多继承那么就需要使用接口技术了.
接口是一种特殊的抽象类,使用关键字interface来声明一个接口,不能实例化对象。接口中的方法必须全是抽象方法成员属性必须是常量。所有的权限必须是public且由子类来拓展。使用implements代替extends来实现接口,一个类只能继承一个父类,但是可实现多个接口。如果一个类同时使用了继承父类和实现接口,必须先继承再实现。
<?php
# 创建一个人类的基类
class people{
public function eat(){
echo "就会吃东西,宅在家里做贡献. <br>";
}
}
# 声明接口 MPopedom
interface MPopedom{
const NAME = "lyshark"; # 接口属性必须是常量
public function popedom(); # 方法必须是public,允许子类继承
}
# 声明接口 MPurview
interface MPurview{
public function purview();
}
# 创建子类Member 实现一个接口 MPurview
class Member implements MPurview{
public function purview(){
echo "当前是在 Member 类中,它继承了MPurview. <br>";
}
}
# 创建子类 Manager 实现多个接口继承 MPopedom,MPurview
class Manager implements MPopedom,MPurview{
public function purview(){
echo "当前在Manager里面,它是一个多继承 purview .<br>";
}
public function popedom(){
echo "当前在Manager里面,它是一个多继承 popedom .<br>";
}
}
# 创建My类,继承people基类,然后再实现多接口继承.
class My extends people implements MPopedom,MPurview{
public function purview(){
echo "当前在My里面,它是一个多继承 purview .<br>";
}
public function popedom(){
echo "当前在My里面,它是一个多继承 popedom .<br>";
}
}
$var = new Member();
$var->purview();
$var1 = new Manager();
$var1->purview();
$var1->popedom();
$var2 = new My();
$var2->eat();
$var2->purview();
$var2->popedom();
?>
implements多态: 多态类似于接口.
<?php
interface USB{
const WIDTH = 5;
public function load();
public function stop();
}
class computer{
function using_usb(USB $u){
$u->load();
$u->stop();
}
}
class Mouse implements USB{
function load(){
echo "load mouse success <br>";
}
function stop(){
echo "stop mouse success <br>";
}
}
class keyboard implements USB{
function load(){
echo "load keyboard success <br>";
}
function stop(){
echo "stop keyboard success <br>";
}
}
class main{
function using(){
$c = new computer();
$m = new Mouse();
$k = new keyboard();
$c->using_usb($m);
$c->using_usb($k);
}
}
$var = new main();
$var->using();
?>
clone 克隆对象: clone 将原对象的所有信息从内存中复制一份,存储在新开辟的内存中用于对象的拷贝,而_clone
方法则是实现将变量obj_type的默认值从book修改为computer.
<?php
class SportObj{
private $obj_type = "book";
public function getType()
{
return $this->obj_type;
}
public function __clone(){
$this->obj_type = "computer"; # 将变量obj_type的值修改为computer
}
}
$book1 = new SportObj();
$book2 = clone $book1;
echo "对象book1 变量 obj_type = : " . $book1->getType(). "<br>" ;
echo "对象book2 变量 obj_type = : " . $book2->getType();
?>
对象之间的比较: 比较对象之间是否有差异,双等于号时比较内容是否一致,三个等于号则是比较引用地址是否一致.
<?php
class SportObj{
private $book_type;
public function __construct($book_type){
$this->book_type = $book_type;
}
}
$book = new SportObj("book");
$clonebook = clone $book;
$referBook = $book;
if($book==$clonebook)
{
echo "book = clonebook 两个对象的内容相等. <br>";
}
if($referBook === $book)
{
echo "referBook = book 两个对象引用地址相等. <br>";
}
?>
对象之间类型检测: instanceof 操作符可以用于检测当前的对象属于哪个类中的成员.
<?php
class BaseObj{
public function init(){
echo "这是基类 <br>";
}
}
class MyBook extends BaseObj{
public function init(){
echo "这是BaseObj的派生类. <br>";
}
}
$var = new MyBook();
if($var instanceof MyBook)
{
echo "对象var 属于 MyBook类";
}
?>
魔术方法set/get: 这两个方法分别用于处理类内未定义的属性或者处理私有属性.
GET: 当程序调用一个未定义或不可见的成员变量时,可以通过__get
方法来读取变量值,该方法有一个参数,表示要调用的变量名。
SET: 当程序试图写入一个不存在或不可见的成员变量时,PHP就会执行__set
方法,该方法含有两个参数,分别是变量名称和变量值且不可省略。
<?php
class BaseObj{
private $name;
private $age;
public $sex=10;
public function __get($key){
if(!isset($this->$key)){
echo "触发了 __get() 方法, {$key} 不存在,不能调用 <br>";
}
}
public function __set($key,$value){
echo "触发了 __set() 方法,设置 {$key} = $value <br>";
}
}
$var = new BaseObj();
$var->age; # 私有函数或不存在则会触发get
$var->age = "22"; # 触发Set
?>
魔术方法call: 当程序试图调用不存在或不可见的成员方法时,PHP会先调用__call
方法来存储方法名称及其参数,该函数包含两个参数,即方法名和方法参数,其中方法参数是以数组形式存在的。
<?php
class BaseObj{
public function MyDemo(){
echo "调用方法如果存在,则会直接执行";
}
public function __call($method,$parameter){
echo "方法名为:" . $method . "<br>";
echo "调用参数:<br>";
var_dump($parameter);
}
}
$var = new BaseObj();
$var->MyDemo(); # 调用方法存在则正常执行
$var->hello("how","what","where") # 不存在则执行call方法
?>
魔术方法callStatic: 当用户调用了一个类中不存在的函数时,默认会触发该函数。
<?php
class BaseObj{
static $name= "lyshark";
function __invoke(){
echo "hello lyshark <br>";
}
static function __callstatic($name,$args){
echo "{$name} 函数没有找到. <br>";
var_dump($args);
}
}
$var = new BaseObj();
$var; # 触发__invoke方法
BaseObj::hello("lyshark","22"); # 如果方法不存在则会执行__callstatic
?>
魔术方法toString: 当使用echo或print输出对象时,可以自动将对象转换为字符串输出,如果没有该方法,直接输出对象将会发生致命错误。
<?php
class BaseObj{
private $name = "lyshark";
public function __toString(){
return $this->name;
}
}
$var = new BaseObj();
echo "对象 var 的值是: ". $var;
?>
魔术方法autoload: 该方法可以自动实例化需要使用的类,当程序要用到一个类但没加载时,该方法会在指定路径自动查找该类名称,如果找到程序继续执行,否则会报错。
# 首先创建: BaseObj.class.php
<?php
class BaseObj{
private $count;
public function __construct($count){
$this->count = $count;
}
public function __toString(){
return $this->count;
}
}
?>
# 接着创建index.php
<?php
function __autoload($class_name){
$class_path = $class_name.'.class.php';
if(file_exists($class_path)){
include_once($class_path);
}else
echo "而理性";
}
$var = new BaseObj("hello lyshark");
echo $var;
?>
序列化与反序列化:
<?php
$arr = array("one","two","three","five");
$json = serialize($arr); # 序列化
print_r(unserialize($json)); # 反序列化
$arr = array("张三","李四","王五");
$code = json_encode($arr);
print_r($code);
print_r(json_decode($code,false));
?>