php 入门 持续更新
php 入门 (1)
前言:
开始学习php了,在此记录下学习笔记,由于主要是自己看,所以写的不会很详细
前言2:已经有两年没更新这个博客了,之前因为各种事情耽误了好多,现在终于有时间继续更新了。记于 2023
-8-19
1 常量
常量:常量就是不变的量,在定义常量后常量无法被改变
常量的定义方法
<?php
const a=100;
?>
我们所定义的\(a\)便是一个常量
常量的定义方式并不只有这一种,我们还可以利用define函数直接定义常量
在这里,我们直接给出w3school中对其的说明,
在这里给出运用的实例。
<?php
define("a",100);
?>
\(a\)便是我们所定义的常量。
2 变量
与常量相对,变量就是可以被改变的量
变量的声明:
<?php
$a=100;
?>
其中\(a\)便是我们所声明的变量
变量有多种数据类型,我们会在以后进行说明。
在这里需要注意一点
php中单引号与双引号有什么不同呢?
我们知道在java ,c++等以C为基础的语言中单引号为字符
双引号为字符串,可在php中,单引号和双引号中即可以是字符,也可以是字符串
他们的区别在于,编译器不会去解释单引号中的内容,例如:
<?php
$a =100;
echo "a=$a";
echo ’a=$a‘;
?>
这两个语句的输出结果是不同的
常量与变量的不同:
- 在设定以后,常量的值无法更改
- 常量名不需要开头的美元符号 ($)
- 作用域不影响对常量的访问
- 常量值只能是字符串或数字
在php中,存在一组超级全局变量,这些超级全局变量可以在一个脚本的全部作用域中可用,不需要特别说明,就
可以在函数以及类中使用
3 数据类型
php中的数据类型大体分为七种
分别是 字符串 ,整数,对象,浮点数,null也就是空,逻辑也就是bool类型,数组
但php是若类型语言,弱类型语言指在使用变量时不用指定变量的类型,在使用时也没有类型检查的一类编程语言
所以在使用变量时,不用事先指定变量类型,在使用时根据上下文由系统解释器来判断变量的类型。
3.1 整型
整数,也就是int
php中int的最大值为9223372036854775807;
最小值为-9223372036854775808;
‘在php中,超过整型最大值或最小值的数用float存储
3.2 浮点数
在php中浮点数的类型与c++不同,float和double是相同的;
其他的数据类型没啥好说的了
3.3 数组
php中的数组和其他编程语言中的数组大同小异,基本没啥区别
<?php
$a = array(1, 2, 3, 4);
$a[0] = 1;
echo $a[1];
这种方式适用于自定义索引创建数组,如果你像使用默认的数字索引,那么创建数组的方式和c++基本上没有区别
<?php
$a=[1,2,3,4];
echo $a[1];
?>
这样创建和输出完全是正确的。
php中的数组和js中的数组类似,可以存储不同的数据类型在同一个数组中
使用count()
方法可以获得数组的长度
<?php
$a = array(1, 'a', 3, 4);
echo count($a);
php中存在关联数组一说,具体实现如下
<?php
$a = array('a' => 1, 'b' => 2, 'c' => 3);
echo $a['a'];
如何遍历关联数组呢?我们采用以下的方式
<?php
$a = array('a' => 1, 'b' => 2, 'c' => 3);
foreach ($a as $i => $i_value) {
echo $i_value;
echo "<br>";
}
使用该方法可以遍历整个关联数组
4 类与对象
定义与c++中的定义差不多,可以参考我的c++博客
直接写用法吧
<?php
class box{
public
$a;
}
$eco= new box();//php的独特写法,类名需要加括号
$eco->a=1;//吐槽一下,个人不喜欢->这样的写法,奈何php与c++不同,只能这样写
?>
5 命名空间
在使用php中,有可能会发生我们调用了另一个php文件,与本php文件中有函数重名,这时候我们要如何区分
呢?
这时候就需要用到命名空间来对其进行区分,c++中我们一般要写的namespace std;便是声明了一个命名空间,php中命名空间的声明与其相同
举个例子
// 假设文件名为1.php
<?php
namespace bo;
function dfs(){
echo 1;
}
?>
// 假设文件名为2.php
<?php
include_once 1.php;
namespace box;
function dfs(){
echo 1111;
}
dfs();
//这时候我们使用的dfs函数就是当前文件下的dfs;如何使用1.php中的“dfs呢?
\bo\dfs();//此时我们调用的便是1.php中的dfs函数了
?>
6 成员方法和类方法
类方法也成为静态方法
成员方法需要实例去执行
而类方法需要实例去执行,
举个例子
<?php
class box {
function dfs()
{
echo 1;//这是一个类方法,我们可以得知。类方法是静态的
}
static function bfs(){
echo "<br>";
echo 1;
}
}
//如果去执行成员方法和类方法呢?
$a=new box();
$a->dfs();//这是执行成员方法,$a则是一个实例
box::bfs();//这是执行类方法我们用到了范围解析符::
?>
要注意,php与c++不同,访问修饰符只能限定其下第一个;号前的语句。
7 静态变量
静态变量的特点就是定义在类中。方法外,与类共存亡
定义方法
static $a;
与成员变量的周期与对象共存亡,而静态变量的周期则与类相同
静态方法中,$this伪变量不允许使用。可以使用self,parent,static在内部调用静态方法与属性。
class Car {
private static $speed = 10;
public static function getSpeed() {
return self::$speed;
}
public static function speedUp() {
return self::$speed+=10;
}
}
class BigCar extends Car {
public static function start() {
parent::speedUp();
}
}
BigCar::start();
echo BigCar::getSpeed();
注意,在调用静态变量的过程中this指针无法使用,应该使用self指针.
注意:静态变量无法在类的外部被调用,子类中调用父类的静态变量可以使用sefl::和parents::两种方法
8 继承
继承,故名思意,就是子类继承父类的成员与方法
举个例子吧
<?php
class people{
public
$a;
public __construct($n,$m){
//省略操作
public use(){
echo 1;
}
}
?>
<?php
require_once “1.php”;
class man extends people{
public __construct($n,$m){
parent::__construct($n,$m);//由父类直接继承变量
}
}
$b =new man();
$b->use();//我们直接调用父类的方法;
?>
在子类中如果定义了__construct则不会调用父类的__construct,如果需要同时调用父类的构造函数,需要使用
parent::__construct()显式的调用。
<?php
class car {
public $a;
public function __construct($f,$g){
echo 1;
}
}
class bus extends car{
public function __construct($f, $g)//我们先从外界得到n,m;
{
parent::__construct($f, $g);//调用父类的构造函数,传入n,m;
}
}
$c = new bus();
$c->b=1;
echo $c->b;
在未定义构造函数的子类中,会默认继承父类的构造函数
进一步理解继承,子类从父类那里继承来什么?只有成员变量和方法
一定要注意是类的继承不是对象的继承,不是子类的一个对象继承了父类的一个对象,
继承只代表子类的对象可以调用父类的方法和成员变量
注意,在调用父类的成员方法和函数的过程中,子类的this指针可以调用父类的成员方法和函数
使用parents::只能调用父类的成员方法,为什么调用父类构造函数的时候必须使用parents::呢?
因为this是用于替代实例的而构造函数不需要实例,所以无法用this替代
我们需要注意,父类中private的成员变量在子类中是无法访问的
但protected是可以在子类中被访问的。
9 魔术方法
定义:所谓魔术方法,就是系统在特定时刻自动调用的方法!先写几种常见的魔术方法,其他的以后遇到再加进去
其实我们经常使用的__construct( )和
__destruct()就是魔术方法.
9.1 ___call()函数
我们在调用类中没有的函数时(非静态)时,系统会自动的调用__call()函数格式如下
<?php
class car{
public function __call($name,$arguments){
//name是我们所调用却没有定义的函数名称,是以string形式被返回的,而arguments则是以数组形式返回的传入的参数
var_dump($name);
print_r($arguments);
}
}
$a=new car();
$a->b(1,1,2);
?>
输出结果:string(1) "b" Array ( [0] => 1 [1] => 1 [2] => 2 )
9.2 __callStatic()函数
与__call()类似,只不过是适用于调用静态函数时
<?php
class car{
public static function __callStatic($name,$arguments){
var_dump($name);
print_r($arguments);
}
}
car::b(1,1,2);
?>
输出结果与上面相同
9.3 __get()
__get()函数会在调用类中未声明的成员变量或已经声明的私有的成员变量时自动调用
会自动将未知成员变量以string形式传入__get()
举个例子
<?php
class car{
public function __get($name){
var_dump($name);
}
}
$a=new car();
echo $a->c;
?>
输出结果为:string(1) "c";
9.4 __set()
与其用法与get类似,只不过__set会在给未声明的成员变量或者私有的成员变量赋值时调用
<?php
class car{
public function __set($property, $value){
var_dump($property);
var_dump($value);
}
}
$a=new car();
$a->c=1;
?>
传入的两个参数一个是成员变量的名称,另一个是所赋的值
输出结果为:string(1) "c" int(1)
9.5 __isset()
了解__isset()函数前我们需要先了解 isser()函数
定义:isset() — 检测变量是否已设置并且非 NULL
检测变量是否设置,并且不是 NULL。
如果已经使用 unset() 释放了一个变量之后,它将不再是 isset()。若使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE。同时要注意的是 null 字符("\0")并不等同于 PHP 的 NULL 常量。
如果一次传入多个参数,那么 isset() 只有在全部参数都以被设置时返回 TRUE 计算过程从左至右,中途遇到没有设置的变量时就会立即停止。
isset()的返回值是bool类型的值,当该变量已被声明且非空,返回true反之返回flase
<?php
class car{
public function __get($name){
// var_dump($name);
}
}
$a=new car();
var_dump(isset($c));
?>
输出结果:bool(false)
接着我们来看__isset()
与isset()类似,都是来检测变量的函数,不过__isset()是写在类中由系统自动调用的函数
当我们对对象中的变量使用isset()函数时,如果变量是公有的,自然可以正确执行,但假设对象不存在或者为私有的,就会自动执行提前写好的__isset()函数
举个例子:
<?php
class car {
private $a;
public function __isset($name)
{
var_dump($name);
}
}
$c=new car();
isset($c->a);
?>
输出结果:string(1) "a";
9.5 __unset();
先说unset()吧
定义:unset() 函数用于销毁给定的变量。
unset()基本上就是释放的变量内存,或者下面程序中会用同名变量
在函数中,unset只能销毁局部变量,并不能销毁全局变量,特别是global引用的变量
如果在函数中 unset() 一个全局变量,则只是局部变量被销毁,而在调用环境中的变量将保持调用
unset() 之前一样的值。
至于__unset()直接类比
__isset()即除了具体功能不同,其他则相同
关于php中的魔术方法就先介绍到这里
10 将函数作为变量
直接看代码吧
<?php
function dfs(){
echo 1;
}
$a="dfs";
$a();
?>
输出结果为:1;
11 global
当我们需要在函数内调用在外部的变量时应该怎么解决?传参是一种方法,我们还可以采用另一种方法
利用global
global的用处是:在一个函数中引入外部的一个变量。
具体用法是
<?php
$a=1;
function usa(){
//echo $a;像这样直接调用外部变量是错误的。
global $a;
echo $a;
}
usa();
?>
注意:不能在用global声明变量的同时给变量赋值。像global $name = "why"的使用方式是错误的。
global本质是传参而不是使变量变成全局
<?php
$a=1;
function usa(){
//echo $a;像这样直接调用外部变量是错误的。
global $a;
echo $a;
}
function uss(){
//echo $a;像这样,就是错误的
}
usa();
uss();
?>
我们要注意,在函数内部使用global定义变量后,若在函数内对其的值进行修改,外部的值也会改变,但如果不用global定义的话,则不会改变。
12 php中的日期操作
注:本节内容参考于w3school中php 日期
在学习本节内容之前,需要注意:php中是有时区设置的
php5.1.开始,php.ini里加入了date.timezone这个选项,默认情况下是关闭的,也就是显示的时间(无论用什么
php命令)都是格林威治标准时间,和北京时间正好差8个小时。
所以我们需要人为设置时区
以下是php中常用的时区标识符
- Asia/Shanghai —— 上海
- Asia/Chongqing —— 重庆
- Asia/Urumqi —— 乌鲁木齐
- Asia/Hong_Kong —— 香港
- Asia/Macao —— 澳门
- Asia/Taipei —— 台北
- Asia/Singapore —— 新加坡
- PRC —— 中国时区
我们只需要在程序的开头加上:date_default_timezone_set("填写所选择的时区标识符即可");
12.1 获得简单的日期
我们用到了php中的date函数来获得简单的日期
date() 函数的格式参数是必需的,它们规定如何格式化日期或时间。
下面列出了一些常用于日期的字符:
- d - 表示月里的某天(01-31)
- m - 表示月(01-12)
- Y - 表示年(四位数)
- l-表示周里的某天
其他字符,比如 "/", "." 或 "-" 也可被插入字符中,以增加其他格式。
<?php
date_default_timezone_set("PRC");
echo date("Y/m/d")."<br>";//年月日
echo date("l");//日期,以英文形式输出
?>
输出结果:
2021/02/17
Wednesday
(暴露了写博客的时间了)
除了这样的写法,还有另一种写法
<?php
$cookie=$_GET['cookie'];
$time = date('Y-m-D h:i:s', time());
echo $time;
?>
这样获得时间也是可以的
12.2 获得简单的时间
下面是常用于时间的字符:
- h - 带有首位零的 12 小时小时格式
- i - 带有首位零的分钟
- s - 带有首位零的秒(00 -59)
- a - 小写的午前和午后(am 或 pm)
下面的例子以指定的格式输出当前时间:
<?php
date_default_timezone_set("PRC");
echo date("h:i:s:a")."<br>";//年月
?>
输出结果:12:30:45:pm(糟糕,又暴露时间了)
在输出时间时,需要注意的是选择的字符大小写不同,输出的内容也不同
y 会输出完整的年份格式,Y则只会输出年份的后两位,比如2023,就只会输出23(又暴露时间
了,没错,这部分内容是距第一次写这篇博客两年后写的,这段时间发生了很多事情,废话不多
说,继续。)
m 会输出数字的月份,如果我们换成大写M,则会输出英文的月份
d ,小写会输出日期,大写会输出英文的这一天的星期。
至于其他的内容,见该博客
PHP date() 函数_date() php_低吟~浅唱的博客-CSDN博客
12.3 通过mktmie()来创建日期
通过date()函数,我们不仅可以获得当前的时间,还可以获得预先设置好的时间,这时候需要用到mktime()来设置
时间戳 在不进行设置的时候,是以当前时间为时间戳的所以通过date()可以获得当前时间
mktime()的具体用法
mktime(hour,minute,second,month,day,year)
mktime()的返回值与time()的返回值一样,不同之处在于time()返回的是unix纪元到当前时间经过的秒数
unix纪元指:1970年1月1日(UTC/GMT的午夜)
而mktime()返回的值是unix纪元到当前设置的时间的秒数所以如果吧time()当成参数传入会得到当前的时间
传入mktime()则可以得到所设定的时间。