php中的

PHP中JSON的应用

互联网的今天,AJAX对于程序员而言已经是非常熟悉的词汇了;说起AJAX,可能会立即想起因RSS而兴起的XML,不可否认,XML是很不错的数据存储方式,但是其灵活恰恰造成了其解析的困难。当然,这里所指的困难,是相对于本文的主角——JSON而言。

JSON为何物?就不重复概念了。通俗的说,它是一种数据的存储格式,就像PHP序列化后的字符串一样。它是一种数据描述。比如我们将一个数组序列化后存放,就可以很容易的反序列化后应用。JSON也是如此,只不过他搭建的是客户端Javascript和服务端PHP的交互桥梁。我们用PHP生成JSON后的字符串,然后把这个字符串传给前台Javascript,Javascirpt就可以很容易的将其反JSON然后应用。说通俗点,它真的很像数组。

言归正传,如何使用JSON。PHP5.2开始内置了JSON的支持。当然,如果低于这个版本的话,那么市面上有很多PHP版本的实现,随便下一个用就OK啦。现在主要是说说PHP内置支持的JSON。很简单,两个函数:json_encode和json_decode(跟序列化很像啦)。一个编码,一个解码。先看看编码的使用:

很简单的将一个数组JSON了。需要指出的是,在非UTF-8编码下,中文字符将不可被encode,结果会出来空值,所以,如果你使用gb2312编写PHP代码,那么就需要将包含中文的内容使用iconv或者mb转为UTF-8再进行json_encode,上面输出结果如下:

跟序列化很像,编码后就要解码,PHP提供了相应的函数json_decode,json_decode执行后,将会得到一个对象,操作如下:

访问对象内的属性,$obj->name,这样子的,当然,也可以把它转位数组,方便调用:

PHP转来转去的用途不是特别大,除了缓存生成,感觉还不如直接存数组呢,不过,当你和前台交互的时候,它的作用就出来了,下面看看怎么用Javascript来使用这段字符:

上面中,直接将这个字符串赋给一个变量,它就变成一个Javascript数组了(专业化术语应该不叫数组,不过由于PHP的习惯问题,我就一直叫数组好了,方便理解)。这样,可以很方便的对arr进行遍历或者任意做你想做的事情了。写到这里,好像都没提到AJAX哦?是哦,联想一下,如果服务端返回的responseText用JSON过的字符串代替XML的话,前台Javascript处理起来是不是很方便呢?

其实写到这里,除了数据的存储格式不太一样外,JSON和XML也没什么太大区别哦,不过下面我说的一点。虽然和XML没多大关系,不过,可以说明JSON更大范围的应用,那就是,跨域的数据调用。由于安全性问题,AJAX不支持跨域调用,这样要调用不同域名下的数据,很麻烦哦,虽然有解决方案(stone在他的讲座上提到过了代理啊什么的虽然听不懂但是知道能解决)。我写两个文件,足以展示跨域调用了。

主调文件index.html

被调文件profile.php

很显然,当index.html调用profile.php时,JSON字符串生成,并作为参数传入getProfile,然后将昵称插入到div中,这样一次跨域数据交互就完成了。

展开
收起

关于PHP语言在内存中的分配(堆和栈的区别)

分享关于编程中的数据在内存里的存储方式,本文以PHP语言为例来分析计算机中各段存储区的区别,代码段、堆空间段、代码段、初始化静态常量段。

在PHP中共有8种数据类型,其中4中标量类型(字符串、布尔型、整型、浮点型)、2种复合类型(对象、数组)、2种特殊类型(资源、NULL)。他们在运行的时候都要加载到内存中去用,那么在内存里面它们是怎么表示的呢?

初始化静态常量段:通常是指用来存放程序中已初始化且不为0的全局变量如:静态变量和常量。

代码段:通常是指用来存放程序执行代码的一块内存区域,比如函数和方法。

栈空间段:是存储占用相同空间长度并且占用空间小的数据类型的地方,比如说整型1,10,100,1000,10000,100000 等等,在内存里面占用空间是等长的,都是64 位4 个字节。存储的都是局部变量,凡是定义在方法中的都是局部变量(方法外的是全局变量),变量有自己的作用域,一旦离开作用域,变量就会被释放。栈内存的更新速度很快,因为局部变量的生命周期都很短。所以在栈空间的数据都是可以通过代码手动进行释放。

栈内存段:数据长度不定长,而且占有空间很大的数据类型的数据。在堆内存是里是不可以直接存取的内存,堆内存存储的是数组和对象(其实数组就是对象)。凡是new建立的都是在堆中,堆中存放的都是实体(对象),实体用于封装数据,而且是封装多个(实体的多个属性),如果一个数据消失,这个实体也没有消失,还可以用,所以堆是不会随时释放的,但是栈不一样,栈里存放的都是单个变量,变量被释放了,那就没有了。堆里的实体虽然不会被释放,但是会被当成垃圾,最后通过垃圾回收机制去实现垃圾回收。对于我们的对象来数就是一种大的数据类型而且是占用空间不定长的类型,所以说对象是放在堆里面的,但对象名称是放在栈里面的,这样通过对象名称就可以使用对象。

$p1=newPerson();

对于这个条代码,$p1 是对象名称在栈内存里面new Person()是真正的对象是在堆内存 里面的,具体的请看下图:

从上图可以看出$p1=new Person();等号右边是真正的对象实例,在堆内存里面的实体, 上图一共有3 次new Person(),所以会在堆里面开辟3 个空间,产生3 个实例对象,每个对象之间都是相互独立的,使用自己的空间,在PHP 里面,只要有一个new 这个关键字出现就会 实例化出来一个对象,在堆里面开辟一块自己的空间。 每个在堆里面的实例对象是存储属性的,比如说,现在堆里面的实例对象里面都存有姓 名、性别和年龄。每个属性又都有一个地址。 $p1=new Person();等号的右边$p1 是一个引用变量,通过赋值运算符“=”把对象的首地址 赋给“$p1”这个引用变量,所以$p1 是存储对象首地址的变量,$p1 放在栈内存里边,$p1 相当 于一个指针指向堆里面的对象,所以我们可以通过$p1 这个引用变量来操作对象,通常我们也 称对象引用为对象。

对你有帮助就点点关注,表示对我的支持谢谢

展开
收起

怎么理解php中的变量?php变量命名注意什么?

 怎么理解php中的变量?

程序中的变量源于数学,在程序语言中能够储存结果或者表示抽象概念。简单理解变量是临时存储值的容器,它可以储存数字、文本、和一些复杂的数据(比如说字符串、复杂的排列组合等),变量在php语言中居于核心地位,是使用php的关键所在,变量的值在程序运行中会随时发生变化,能够把程序中准备使用的一段数据起一个简短容易记得名字,另外它还可以保存用户输入数据和特点运算的结果,总结变量是变量是用于跟踪几乎所有类型信息的简单工具。

php语言中的变量

php数据存储单元是变量和常量存储各种类型的数据,php是一种弱类型的语言,使用变量前不用声明变量,赋值时就是创建了变量,这个原因使的php语法和c语言、java(强类型语言)有很大的不同。

php变量的声明和注意

在php声明变量必须使用一个美元符号“$”后面跟变量名表示,然后再使用赋值操作(=)给一个变量赋值。如图所示

php变量声明后有一定的使用范围,大部分php变量不是在函数中里声明的,只有声明处到文件结束的一个单独范围使用,这个单独范围可以在一个页面的所有的php模式下使用,也包括了include和require引入文件,在变量使用周期内可以用unset()释放指定的变量,使用isset()检查变量是否设置,使用isempty()检查变量是否为空。

 php变量命名规则

1、区分大小写

$A和$a$ 是两个不同的变量,(系统内置结构和关键字,用户自定义类和函数名是区分大小写)。

2、变量以 $ 符号开头,其后是变量的名称。

3、变量名称必须以字母或下划线开头而且不能以数字开头。

4、变量名称只能包含字母数字字符和下划线(A-z、0-9 以及 _)

如果变量是字母构成,通常采用全部小写方式作为变最名。如果变量是由多个单同构成,第一个字母全部用小写,以后的每个字母大字。如:$aaaBbbCcc风格,建议大家可以使用这种变量命名方式,关于php变量今天先介绍到这,明天继续介绍,大家有的好的想法可以一块讨论下!

展开
收起

怎么理解php中的数组?php的数组创建和使用方法是什么?

php数组的定义

数组就是值类型相同的变量的集合,在PHP中的一种常用的复合数据类型,数据可以存放很多的数据,可以存储任何类型的数据。我们可以把变量当做一个包含值得盒子,那么可以把数组当做当成一个带有隔层的盒子,每一层都可以存放一个值。

数组中的元素是什么?

在数组中每一个值叫做数组的元素。也可以在方括号使用索引添加新元素,或者把新的值赋给已知数组元素。

$myarray[3]=‘four’;

数组的创建方法

PHP中,创建数组最简单的办法是使用array命令如下:

$myarray=array(‘one’,2,‘three’);

这段代码是创建了一个叫$my array的数组,它包含了三个值:‘one’,2,‘three’,在这个数组中第一个和第三个包含了字符串,而第二个包含了一个数字。

要想访问数组中的值,你需要知道其索引。数组通常使用的数字作为指向所包含的的值索引,索引一般从0开始,数组第一个值得索引是0,以此类推数组第n个元素的索引为n-1,一般是数组变量名放置方括号,把索引放到括号内,获取这个值

$myarray[0]的值是‘one’,$myarray[1]的值是‘2’、$myarray[2]的值是‘three’

php中可以使用多种方法构造一个数组,除了用array()函数外,也可以用一定数量的逗号分隔的key=>value参数对构造数组。

$myarray=array("one"=>"1","two"=>"2","three"=>"3");

PHP数组

php中的数组的分类

数值数组(带有数字 ID 键的数组)

比如说

$cars[0]="red";

$cars[1]="blue";

$cars[2]="white";

关联数组 (带有指定的键的数组,每个键关联一个值)

比如:$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");

多维数组 (2个数组以上的数组)

二维数组:

$cars = array ( array("小明",“男”,10), array("小红",“女”,11), );

今天关于php数组先介绍到这,如果有什么好的想法可以一块讨论下!

展开
收起

PHP类中成员方法

实例属性和静态属性

class 类名{

var $属性名1 = 值1; //定义实例属性,有初值

var $属性名2 ; //定义实例属性,无初值;

static $属性名3 = 值3; //定义静态属性,有初值

static $属性名4 ; //定义静态属性,无初值;

//其实,是静态属性,是在属性名前面加上“static”关键字

}

实例属性:

它是“隶属于”对象的属性;

每new(实例化)一个对象,则该对象上就具有了该实例属性。

使用形式:

$对象->实例属性名;

可见,实例属性,是通过对象来使用它;

静态属性:

它是“隶属于”该类本身——而不隶属于对象。

即使new很多个对象,也只有一个该属性——即只能保存一份数据;

使用形式:

类名::$静态属性名;

可见:静态属性,是通过类来使用它;

实例方法和静态方法

实例方法:

定义形式:

function 方法名(形参1,形参2,...) { ..... }

使用形式:

$对象->方法名(实参1,实参2,....);

实例方法也是“隶属于”对象;

不过,因为方法不是“容器”,不是“数据”,而是一段可执行的代码;

注意:多个不同的对象,调用一个共同的方法,也只是调用而已,并不像实例属性一样,区分“你的”还是“我的”

静态方法:

定义形式:

static function 方法名(形参1,形参2,...) { ..... }

使用形式:

类名::方法名(实参1,实参2,....);

静态方法也是“隶属于”类;

展开
收起

PHP中解决跨域访问

PHP跨域访问

PHP是通过 header() 来设置Header头部来解决客户端的跨域问题的。1、允许单个域名访问指定某域名(a)跨域访问域名(z),则只需在b文件头部添加如下代码:<?phpheader('Access-Control-Allow-Origin:a');2、允许多个域名访问指定多个域名(a、b等)跨域访问(z),则只需在域名z项目的入口文件头部添加如下代码:<?php$origin = isset($_SERVER['HTTP_ORIGIN'])? $_SERVER['HTTP_ORIGIN'] : ''; $allow_origin = array( 'a', 'b' ); if(in_array($origin, $allow_origin)){ header('Access-Control-Allow-Origin:'.$origin); }3、允许所有域名访问允许所有域名访问,则只需在域名(z)文件头部添加如下代码:<?phpheader('Access-Control-Allow-Origin:*');4、设置Preflight Request(预检请求)中,将会在正式请求的 Access-Control-Expose-Headers 字段中出现的首部信息<?phpheader("Access-Control-Allow-Headers:Origin, X-Requested-With, Content-Type, Accept,Authorization");5、设置允许跨域请求的方法<?phpheader('Access-Control-Allow-Methods:GET,HEAD,POST,PATCH,PUT,OPTIONS,DELETE,CONNECT,TRACE');

6、Tips

请注意 header() 必须在任何实际输出之前调用,不管是普通的 HTML 标签,还是文件或 PHP 输出的空行,空格。这是个常见的错误,在通过include,require,或者其访问其他文件里面的函数的时候,如果在header()被调用之前,其中有空格或者空行。 同样的问题也存在于单独的 PHP/HTML 文件中。

设置中的选项值,有的并未给全,更多资料,详见【MDN WEB DOCS】

展开
收起

利用php中双等于和三等于的区别,无需密码拿到flag

这是一道CTF中常见的题目,我们来看一下题目描述(其实ctf中题目描述很多都是没用的,甚至还会误导我们)

题目描述先让我们找密码:

打开这个页面,似乎并没用什么东西出现。根据经验我们要看一下源码有没有东西!

右键查看源码:发现有个注释掉的index.txt

我们来看一下index.txt,果真提示性代码出来了。

isset($_GET['password'])//满足passwd不为null strcmp($_GET['password'], $flag) == 0//password和flag相等

其实这么多就这两行有用(让我想到了开发最后就是再写if/else),看到上面我注释好的passwd满足的条件了把,password不为null且password和flag字符串相同?

第一个不为null很好满足,那第二个条件呢?看似strcmp函数对比两个字符串相同则返回0否侧返回正数或者负数,但是很明显我们要是知道flag我们还做它干啥,这里一定要看清和0对比是用的==而不是===,这就是php的魅力,===是要类型,内容相等,而==只要内容相等即可。

什么是内容相等呢,false和0是相等的,那这里我们想strcmp函数中什么时候会返回false呢,只有当对比的两个对象不是同一类型时会返回false。

这里我们就想flag肯定是字符串,那我们让password为数组的情况下肯定返回为false了。

构造如下:

flag就出来了!

虽然这是一个CTF题目,但是php开发的小伙伴一定要注意再strcmp和==同时使用时候的特点,避免留下漏洞被利用。

展开
收起

PHP7版本中有哪些新特性?

PHP7版本中的新特性有哪些?

一点PHP博客分享关于php7.0中的一些新特征,在PHP7中由于修改了底层引擎大部分代码,以及通过各种方式提高PHP的性能,所以在PHP7中也增加了一些新的语法,这些语法的使用也能对提高性能有帮助。

1.标量参数类型声明

现在支持字符串(string)、整型(int)、浮点数(float)、及布尔型(bool)参数声明,以前只支持类名、接口、数组及Callable两种风格:强制转换模式(默认)与严格模式

2.返回类型声明

3.??运算符

?? 用于替代需要isset的场合,这是一个语法糖。

4.<=> 比较运算符

就是看两个表达式值的大小,三种关系: = 返回0、< 返回-1、 > 返回 1

5.define支持定义数组类型的值

php 5.6已经支持CONST 语法定义数组类的常量,PHP7中支持define语法。

6.匿名类

7.增加了整除函数 intdiv

小结:

新特性

性能提升:PHP 7要比PHP 5.6快两倍,具体如何让PHP7中的性能达到最大化,可以看之前博主发的一篇文章。

全面一致的64位支持

移除了一些老的不在支持的SAPI(服务器端应用编程端口)和扩展

新增了空接合操作符(??)

如果觉得对你有帮助,请点点关注,也是对我的一种支持和鼓励,关注后查看更多内容。

不忘初心,继续编程。

展开
收起

PHP中&符号的神秘用处

官方说明:

在 PHP 中引用意味着用不同的名字访问同一个变量内容。这并不像 C 的指针:例如你不能对他们做指针运算,他们并不是实际的内存地址。替代的是,引用是符号表别名。注意在PHP 中,变量名和变量内容是不一样的,因此同样的内容可以有不同的名字。最接近的比喻是 Unix 的文件名和文件本身——变量名是目录条目,而变量内容则是文件本身。引用可以被看作是 Unix 文件系统中的硬链接。

&:表示引用,在变量或者函数、对象等前面加上该符号

&符号使用场景

变量引用

引用允许用两个变量来指向同一个内容

变量引用

函数引用传递(传址调用)

可以将一个变量通过引用传递给函数,这样该函数就可以修改其参数的值

函数引用传递

函数引用返回

引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时。不要用返回引用来增加性能,引擎足够聪明来自己进行优化。仅在有合理的技术原因时才返回引用!

函数引用返回

对象引用

在PHP5以上,对象的 = 赋值和传递都是引用。要想实现拷贝副本,需要通过clone函数进行处理。

PHP中对象的深拷贝,指的是拷贝对象副本,也就是用clone函数拷贝出一个完全一样的对象,修改该对象,并不会影响原始对象;

PHP中对象的浅拷贝,指的是对象进行引用赋值,其中一个改变,另一个也随之改变。

对象引用

引用取消

使用unset(),unset 一个引用,只是断开了变量名和变量内容之间的绑定。(这并不意味着变量内容被销毁了)

展开
收起

PHP中“|”和“||”的简单比较

在PHP中“|”和“||”都是OR(或)运算符,那么它们之间有什么区别?下面本篇文章就来带大家认识一下运算符“|”和“||”,对它们进行简单比较,了解它们之间的区别。

运算符“|”

它是一个按位OR运算符,二元运算符;它对变量的位进行操作。如果有两个变量a,b,进行$a | $b;则是将把 $a 和 $b 中任何一个为 1 的位设为 1。

示例:

$a = 3; $b = 10; echo $a | $b; ?>

输出:

说明:

在上面的示例中,给定两个值,a = 3和b = 10;然后将这两个数字转换为二进制数,即a = 0011和b = 1010;最后应用OR(|)运算并计算$a | $b的值。

运算符“||”

这是一个逻辑OR运算符,布尔运算符;它对变量的布尔值进行操作。如果其中任何一个变量的布尔值为true,则$a || $b的值为1。

示例:

$a = 3; $b = 10; echo $a||$b; echo ''; if($a = 3 || $b = 0) echo '1'; else echo '0'; ?>

输出:

说明:

在上面的示例中,给定两个值,a = 3和b =10;因此变量a和变量b的布尔值都为true,则$a||$b的值为1;在if语句中,检查其中一个条件是否为真,因为变量a值被设置为3,布尔为true,因此执行“$a = 3 || $b = 0”的值为1。

以上就是本篇文章的全部内容,希望能对大家的学习有所帮助。更多精彩内容大家可以关注php中文网相关教程栏目!!!

展开
收起