菜单

其次章 PHP入门基础之php代码写法

2019年1月23日 - 金沙编程资讯
 1 $a =  0; 
 2 $b="0"; 
 3 $c= ''; 
 4 $d= null; 
 5 $e = false;
 6  
 7 echo "5个变量-原始测试类型";
 8     var_dump($a);//int 0
 9     var_dump($b);//string '0'
10     var_dump($c);//string ''
11     var_dump($d);//null
12     var_dump($e);//boolean false
13  
14 echo "<h4>empty测试</h4>";
15     var_dump(empty($a));//true
16     var_dump(empty($b));//true
17     var_dump(empty($c));//true
18     var_dump(empty($d));//true
19     var_dump(empty($e));//true
20  
21 echo "<hr>";
22     var_dump(isset($a));//true
23     var_dump(isset($b));//true
24     var_dump(isset($c));//true
25     var_dump(isset($d));//【false】 见结论一
26     var_dump(isset($e));//true
27  
28 echo "<h4>(==)双等式测试</h4>";
29     var_dump($a == $b);//true
30     var_dump($a == $c);//true
31     var_dump($a == $d);//true
32     var_dump($a == $e);//true !!
33  
34     var_dump($b == $c);//【false】见结论二
35     var_dump($b == $d);//【false】见结论二
36     var_dump($b == $e);//true
37  
38     var_dump($c == $d);//true
39     var_dump($c == $e);//true
40  
41 echo "<h4>(===)三等式测试</h4>";
42     var_dump($a === $b);//false
43     var_dump($a === $c);//false
44     var_dump($a === $d);//false
45     var_dump($a === $e);//false
46  
47     var_dump($b === $c);//false
48     var_dump($b === $d);//false
49     var_dump($b === $e);//false
50  
51     var_dump($c === $d);//false
52     var_dump($c === $e);//false

一.在web页面嵌入PHP代码的二种风格 引进使用正式风格或简捷风格

近年来在为集团面试新人,平日会问到的一道题目就是PHP类型转换的值,例如:
 
var_dump((int)true);
var_dump((string)true);
var_dump((string)false);
var_dump((bool)”1″);
var_dump((bool)”0″);
var_dump((bool)””);
var_dump((bool)”false”);

PHP函数:empty() 和 isset()
都是判断变量是还是不是已安插的函数,不过使用的时候仍然存在必然的区分。

总结:

复制代码 代码如下:

我印象中最早见到那道问题是在英极的PHP高级开发工程师岗位的笔试题里面,看似很基础,不过如故得以难住不少PHPer。先来看一下运转结果:

empty()
函数用来测试变量是或不是早已安顿。若变量已存在、非空字符串或者非零,则赶回
false 值;反之重临 true。

对于 【0‘0’null
false】五种档次

<?php
//标准风格
echo ‘Hello World!’;
?>
<?
//简短风格
echo ‘Hello World!’;
?>
<script language=”php”>
//script风格
echo ‘Hello World!’;
</script>

int(1)
string(1) “1”
string(0) “”
bool(true)
bool(false)
bool(false)
bool(true)

isset() 函数用来测试变量是还是不是已经安排。若变量已存在则赶回 true
值。其他情状重临 false 值。

empty操作以上八个变量,都回去false

二.代码注释的四种办法

对此大多数人来说,第1、2、4行平时是向来不问题的。不过为啥false转换为字符串是空字符串呢?在处理请求值时,平日会传一个字符串类型的false,不过“false”(字符串)并非false(布尔),那有点令人可疑了。

从地点七个函数的定义可以看看 empty() 和 isset()
的共同点是:都足以判断一个变量是还是不是为空,都回来boolean类型,即true或false。而它们最显明有别于的地点就是:再次回到的布尔值刚好是相反。

强等于(===)比较都为false,同强语言结果(多个等号相比较不但要相比值,而且要相比类型)

复制代码 代码如下:

怎么会这么吧?

其它,他们之间最大的分歧就是对于0的判定,若用empty判断会觉得是空,用isset则觉得不为空,举个例证:

但对于(==)相比,要求留意string类型,涉及到底层结构与类型转换

<?php
//单行注释
/*
* 多行注释
*/
#shell风格注释
/**
* PHPdoc风格注释
*/
?>

有关这几个题目,大家从PHP内核出手,看看在类型转换时系统内部到底发生了什么样。

<?php

 

三.向浏览器输出字符串的二种办法

先是补充部分有关PHP弱类型达成模式的背景知识。PHP解释器是运用C语言写成的,当然最后对变量的处理,也会接纳C语言构造数据结构来贯彻。在Zend引擎中,一个PHP变量对应的连串是zval。

          var $a=0;

敲定一:关于变量类型的知道

复制代码 代码如下:

打开Zend/zend_types.h文件,我们得以见到zval类型的概念,php-5.5.23版本大概在第55行左右:

           //empty($a)返回true

1.null为不设有之意:php底层的zval空间里(结构见下方)没有存其value值,只存储了一个type标志其
IS_NULL(所以解释了 empty(null)=true,isset(null)=false
,isset(”)=true)

<?php
/*
* echo函数的意义:向浏览器输出字符串
* 函数再次回到值:void
*/
echo ‘echo function!’;
echo(‘<br/>’);
/*
* echo函数的功能:向浏览器输出字符串
* 函数重临值:int
*/
print ‘print function’;
echo(‘<br/>’);
echo print ‘echo value of print function. ‘;
echo(‘<br/>’);
/*
* printf函数的职能:向浏览器输出字符串
* 函数重返值:所打印字符串的长短
*/
printf(“a weekend have %d days”,7);
echo(‘<br/>’);
echo printf(“a weekend have %d days”,7);
echo(‘<br/>’);
/*
* sprintf函数的功力:把字符串保存到内存中
* 函数再次来到值:保存的字符串本身
*/
sprintf(‘sprintf function’);
echo(‘<br/>’);
echo sprintf(‘sprintf function’);
echo(‘<br/>’);
?>

typedef struct _zval_struct zval;

           if(empty($a)){

2.【0 ; ‘0’ ; ” ;
false
】:那三个为存在,php底层是开发zval空间存储,有value,有type

输出结果:
echo function test!
print function test.
print function test. 1
a weekend have 7 days
a weekend have 7 days. 23
sprintf function test
常用类型提醒符

这么我们发现,zval其实是一个名为_zval_struct的结构体类型,大家在Zend/zend.h文件中找到这一个结构体的概念,大约在320行左右起初:

                 echo “判断结果是空”

 

类型

描述

%b

整数,显示为二进制

%c

整数,显示为ASCII字符

%d

整数,显示为有符号十进制数

%f

浮点数,显示为浮点数

%o

整数,显示为八进制数

%s

字符串,显示为字符串

%u

整数,显示为无符号十进制数

%x

整数,显示为小写的十六进制数

%X

整数,显示为大写的十六进制数

 
typedef union _zvalue_value {
long lval; /* long value */
double dval; /* double value */
struct {
char *val;
int len;
} str;
HashTable *ht; /* hash table value */
zend_object_value obj;
} zvalue_value;
 
struct _zval_struct {
/* Variable information */
zvalue_value value; /* value */
zend_uint refcount__gc;
zend_uchar type; /* active type */
zend_uchar is_ref__gc;
};

           }

结论二:

四.标识符与变量 1.标识符的主干规则:
1) 标识符可以是轻易长度,而且可以由其余字母、数字、下划线组成。
2) 标识符不能以数字初阶。
3) 在PHP中,标识符是分别轻重缓急写的。
4) 一个变量名称可以与一个函数名称相同。
2.变量赋值:

世家可以看看,_zval_struct中含有几个重点的成员,一个是zvalue_value类型的value,一个是zend_uchar类型的type。注意zvalue_value类型是一个联合体,它用来囤积一个PHP变量的值的音讯。(假如你忘记了如何是联合体,我来解释一下。联合体类似结构体,可是联合体的中的成员,存储时有且只可以有一个,而且联合体占用的长空是联合体中长度最长的要命成员,那样做是为着节省外存的运用。)在zvalue_value中,包括了long、double、struct、HashTable、zend_object_value几个种类的分子。他们分别用来囤积PHP变量分裂类其余值:
C类型  PHP类型
long  bool
int
resource
double  float
struct  string
HashTable  array
zend_object_value  object

          //isset($a)返回true

1、string ‘0’与 string  不等于,(想转手就了然,同系列比较【1个长度】的字符串怎么可能
等于 【0个长度】 的字符串)

复制代码 代码如下:

观察这么些结构体之后,想必也就领悟了常问的比如说PHP中int类型的取值范围,以及php中strlen的光阴复杂度之类的题目。

           if(isset($a)){

2、int 0 却和 string 
空相等,(非同类形相比较,php会做类型转换)

<?php
$sum = 0;
$total = 1.22;
$sum = $total;
echo $sum; //1.22
?>

不言而喻,PHP的变量类型转换,或者说是弱类型完毕,本质上是兑现zval类型在不一致门类之间的转移。除了成功zvalue_value的数值转换,还索要将_zval_struct中的type设置成当前变量的type类型。在Zend引擎中完结了convert_to_*一种类函数达成这一转换,大家在Zend/zend_operators.c中能够观望那个转换函数,在大致511行左右,可以找到转换为布尔类型的函数:

                 echo “判断结果不是空”

3、string ‘0’null 不相等,int 0
null
相等

3.变量的数据类型:
宗旨数据类型

 
ZEND_API void convert_to_boolean(zval *op) /* {{{ */
{
int tmp;
 
澳门金沙国际,switch (Z_TYPE_P(op)) {
case IS_BOOL:
break;
case IS_NULL:
Z_LVAL_P(op) = 0;
break;
case IS_RESOURCE: {
TSRMLS_FETCH();
 
zend_list_delete(Z_LVAL_P(op));
}
/* break missing intentionally */
case IS_LONG:
Z_LVAL_P(op) = (Z_LVAL_P(op) ? 1 : 0);
break;
case IS_DOUBLE:
Z_LVAL_P(op) = (Z_DVAL_P(op) ? 1 : 0);
break;
case IS_STRING:
{
char *strval = Z_STRVAL_P(op);
 
if (Z_STRLEN_P(op) == 0
|| (Z_STRLEN_P(op)==1 && Z_STRVAL_P(op)[0]==’0′)) {
Z_LVAL_P(op) = 0;
} else {
Z_LVAL_P(op) = 1;
}
STR_FREE(strval);
}
break;
case IS_ARRAY:
tmp = (zend_hash_num_elements(Z_ARRVAL_P(op))?1:0);
zval_dtor(op);
Z_LVAL_P(op) = tmp;
break;
case IS_OBJECT:
{
zend_bool retval = 1;
TSRMLS_FETCH();
 
convert_object_to_type(op, IS_BOOL, convert_to_boolean);
 
if (Z_TYPE_P(op) == IS_BOOL) {
return;
}
 
zval_dtor(op);
ZVAL_BOOL(op, retval);
break;
}
default:
zval_dtor(op);
Z_LVAL_P(op) = 0;
break;
}
Z_TYPE_P(op) = IS_BOOL;
}
/* }}} */

           }
 ?>

 

类型

名称

Integer

整数

Float

单精度浮点数

Double

又精度浮点数

String

字符串

Boolean

布尔

Array

数组

Object

对象

case
IS_STRING那段代码即是将一个字符串类型变量转换为布尔型的操作。可以看看,只有空字符串,或者字符串长度为1,并且此字符为0时,字符串的布尔值才为1,也就是true,其余为0,也就是false。

empty()
判断一个变量是还是不是为“空”,同时还会检测变量是不是为空、为零。当一个变量值为0,empty()
认为这一个变量同等于空,即一定于尚未安装。而isset()
判断一个变量是或不是早已设置,即便变量值为空,为零也算已安装。

小说转自:

4.类型强度
PHP是动态语言,是一种至极弱的档次语言,在程序运行时,可以动态的变动变量的连串。
5.类型转换:
隐式类型转换:

相同的,大家也就精晓了布尔值怎样更换为字符串的,可以从_convert_to_string函数的贯彻中询问。

一、举例说明

复制代码 代码如下:

好像简单并且基础的PHP问题,究其根源是对PHP已毕机制的把握。个人觉得,那道题也正是鉴别PHPer知识边界的一道好题材。

A.怎么样判断一个变量是还是不是定义?

<?php
$sum = 0;
$total = 1.22;
$sum = $total;
echo gettype ( $sum );//double
?>

<?php
// 借使不存在$test 变量
 
$isset = isset($test) ? “test is define!” : “test is undefine!”;
echo “isset:$isset”, ‘<br />’;

显式类型转换:

$empty = !empty($test) ? “test is define!” : “test is undefine!”;
echo “empty:$empty”, ‘<br />’;
 
$is_null = is_null($test) ? “test is define!” : “test is undefine!”;
echo “is_null:$is_null”;
测试结果是:

复制代码 代码如下:

isset:test is undefine!
empty:test is undefine!
is_null:test is define!
结果注脚:
empty,isset首先都会检讨变量是还是不是留存,然后对变量值举行检测。而is_null
只是一贯检查变量值,是不是为null,由此只要变量未定义就会师世谬误!

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图