请问php中$c=(-3)^3;php echo 输出二进制$c;会输出多少?为什么?

3499人阅读
《PHP5中文手册》内容中&引用的解释&一文的摘要:
1. PHP中引用的特性
PHP中引用意味着用不同的名字访问同一个变量内容,引用不是C的指针(C语言中的指针里面存储的是变量的内容,在内存中存放的地址),是变量的另外一个别名或者映射。注意在
PHP 中,变量名和变量内容是不一样的,因此同样的内容可以有不同的名字。最接近的比喻是 Unix 的文件名和文件本身――变量名是目录条目,而变量内容则是文件本身。引用可以被看作是 Unix 文件系统中的紧密连接或者wins的快捷方式。
2.变量的引用
PHP 的引用允许用两个变量来指向同一个内容。
$a = & ABC & ;
$ // 这里输出:ABC
$ // 这里输出:ABC
$b = & EFG & ;
$ // 这里$a的值变为EFG 所以输出EFG
$ // 这里输出EFG
?&这意味着 $a 和 $b 指向了同一个变量。
注: $a 和$b
在这里是完全相同的,这并不是$a 指向了$b
或者相反,而是$a 和$b
指向了同一个地方。
<span style="font-family:Verdana,Helvetica,A color:#&对象的引用(对象的赋&#20540;传递)
在PHP5中两者映射到同一对象,不需要使用引用符。
class fooclass{
$a = new fooclass();
$a-&att = 1;
$b-&att = 2;
echo 'a obj:',($a-&att),'&br&';
echo 'b obj:',($b-&att);
在PHP5中 对象的赋&#20540;是个引用的过程。上列中
$a = new fooclass();
其实等效于$b=new&fooclass(); $c=&$b;
PHP5中默认就是通过引用来调用对象, 但有时你可能想建立一个对象的副本,并希望原来的对象的改变不影响到副本 . 为了这样的目的,PHP5定义了一个特殊的方法,称为__clone。
自 PHP 5 起,new 自动返回引用,因此在此使用 =& 已经过时了并且会产生 E_STRICT 级别的消息。
在php4中,对象的赋&#20540;是个拷贝过程,
$a = new foo&fooclass(), 实际上$a和new fooclass()的映射到不同对象实例,其中new
fooclass产生的是一个匿名的fooclass对象实例&所以需要显式地使用$a = & new fooclass()来进行引用赋&#20540;传递。
所以在php4中,为了节省内存空间,$b=new fooclass()一般会改成引用的模式,即 $b=& new fooclass()。
4.函数的引用传递(传址调用)
引用传递的定义必须在函数定义中体现,在函数使用中,不要写成foo(&$a)的样子,否则会报&Call-time
pass-by-reference过时&的警报。
foo( & $a ){
$a = $a + 100 ;
$ // 输出1
foo( $b );// 这里$b传递给函数的其实是$b的变量内容所处的内存地址,通过在函数里改变$a的值 就可以改变$b的值了
& &br& & ;
$ // 输出101
但是在函数“call_user_func_array”中,若要引用传参,就得需要 & 符号,如下代码所示:
test( & $b ){
call_user_func_array ( 'test' , array ( & $c ));
&5 函数的引用返回
$b = 0 ; // 申明一个静态变量
$b = $b + 1 ;
$a = test(); // 这条语句会输出 $b的值 为1
$a = test(); // 这条语句会输出 $b的值 为2
$a =& test(); // 这条语句会输出 $b的值 为3
$a = test(); // 这条语句会输出 $b的值 为6
通过这种方式$a=test();得到的其实不是函数的引用返回,这跟普通的函数调用没有区别,只是将函数的&#20540;赋给$a而已, 而$a做任何改变 都不会影响到函数中的$b。
而通过$a=&test()方式调用函数呢, 他的作用是 将return $b中的 $b变量的内存地址与$a变量的内存地址 指向了同一个地方
即产生了相当于这样的效果($a=&$b;) 所以改变$a的&#20540; 也同时改变了$b的&#20540; 所以在执行了
$a=&test();
以后,$b的&#20540;变为了5。
和参数传递不同,这里必须在两个地方都用&&&符号:定义和使用时都需要加&符号。
& test()指出返回的是一个引用,而不是通常的一个拷贝。
$a =& test()同样也指出 $a 是作为引用的绑定,而不是通常的赋&#20540;。
这里是为了让大家理解函数的引用返回才使用静态变量的,其实函数的引用返回多用在对象中:
* This is the way how we
pointer to access variable inside the
& $aa -& get();
$aa -& out();
$aa -& out();
$aa -& out();
$aa -& out();
//the output is
& Hi How Are You &
6 global 引用
当用 global $var 声明一个变量时实际上建立了一个到全局变量$_GLOBAL的引用。具体可以写成如下语句:
$GLOBALS [ &var& ];
把& global $ 当成是& $var =& $GLOBALS['var']; 的简写。从而将其它引用赋给& $var 只改变了本地变量的引用。
如果全局变量赋&#20540;给另外另外一个变量$var_test,删除这个$var_test,也不会 unset 全局变量
$var = &Example variable&;
$var_test =
$GLOBALS [ 'var' ];
echo '$var_test is set to ',$var_test,'&br&'; //
$var_test = 11;
unset($var_test);
echo '$GLOBALS[var] is set to ',$GLOBALS ['var'],'&br&';
* 输出结果:
$var_test is set to Example variable
$GLOBALS[var] is set to 11
如果在一个函数内部给一个声明为 global 的变量赋于一个引用,该引用只在函数内部可见。可以通过使用 $GLOBALS 数组避免这一点。
$var1 = &Example variable&;
$var2 = &&;
function global_references($use_globals) {
global $var1, $var2;
if (!$use_globals) {
$var2 =& $var1; // visible only inside the function
$GLOBALS[&var2&] =& $var1; // visible also in global context
global_references(false);
echo &var2 is set to '$var2'&, '&br&'; // var2 is set to ''
global_references(true);
echo &var2 is set to '$var2'&; // var2 is set to 'Example variable'
$var2 =& $var1; // visible only inside the function
那么实际上就是改变了$var2的映射关系,之前与$_GLOBAL['var2']的映射就断开了,再也无法修改函数外部$var2的内容。此特性也同样作用在用引用传递函数参数的例子中。
另外,需要注意在函数中unset($var2)不会真正释放变量内容,可以看做只是断开了函数内部$var2的映射而已。
7 . 取消引用 unset与=null
当你 unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。例如:
echo $b; //输出:1:
不会 unset $b,只是 $a。
使用unset($a)与$a=null的结果是不一样的。如果该块内存只有$a一个映射,那么unset($a)与$a=null等价,该内存的引用计数变为0,被自动回收;如果该块内存有$a和$b两个映射,那么unset($a)将导致$a=null且$b不变的情况,而$a=null会导致$a=$b=null的情况。
原因:某变量赋&#20540;为null,将导致该变量对应的内存块的引用计数直接置为0,被自动回收。
在一个对象的方法中,$this 永远是调用它的对象的引用。
9. PHP引用使用注意事项
很多人误解Php中的引用跟C当中的指针一样,事实上并非如此,而且很大差别。C语言中的指针除了在数组传递过程中不用显式申明外,其他都需要使用*进行定义,而php中对于地址的指向(类&#20284;指针)功能不是由用户自己来实现的,是由Zend核心实现的,php中引用采用的是“引用计数、写时拷贝”的原理,()
就是除非发生写操作,指向同一个地址的变量或者对象是不会被拷贝的,比如下面的代码:
$a = array('a','c'...'n');
如果程序仅执行到这里,$b和$b是相同的,但是并没有像C那样,$a和$b占用不同的内存空间,而是指向了同一块内存,这就是php和c的差别,并不需要写成$b=&$a才表示$b指向$a的内存,zend就已经帮你实现了引用,并且zend会非常智能的帮你去判断什么时候该这样处理,什么时候不该这样处理。
如果在后面继续写如下代码,增加一个函数,通过引用的方式传递参数,并打印输出数组大小。
function printArray(&$arr) //引用传递
print(count($arr));
printArray($a);
上面的代码中,我们通过引用把$a数组传入printArray()函数,zend引擎会认为printArray()可能会导致对$a的改变,此时就会自动为$b生产一个$a的数据拷贝,重新申请一块内存进行存储。这就是前面提到的“引用计数、写时拷贝”概念。
直观的理解:$a将使用自己原始的内存空间,而$b,则会使用新开辟的内存空间,而这个空间将使用$a的原始($a或者$b改变之前)内容空间的内容的拷贝,然后做对应的改变。
如果我们把上面的代码改成下面这样:
function printArray($arr)
print(count($arr));
printArray($a);
上面的代码直接传递$a&#20540;到printArray()中,此时并不存在引用传递,所以没有出现写时拷贝。
$a = array(1,2,3);
function printArray($arr)
print(count($arr));
$s = microtime(true);
for($i=1;$i&10000;$i++){
printArray($a);
$e = microtime(true);
echo '=----------------------------';
echo $e-$s;//0.348 s
$a = array(1,2,3);
function printArray(&$arr)
//引用传递
print(count($arr));
$s = microtime(true);
for($i=1;$i&10000;$i++){
printArray($a);
$e = microtime(true);
echo '=----------------------------';
echo $e-$s;//0.127
&#20540;传递:0.348 s
引用传递: 0.127
结果引用传递性能下降:50%左右。
所以不正确使用引用,性能反而下降。
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2581758次
积分:21314
积分:21314
排名:第161名
原创:206篇
评论:898条
(2)(1)(2)(1)(1)(2)(1)(1)(1)(1)(1)(2)(2)(1)(2)(3)(3)(3)(2)(2)(4)(3)(2)(15)(6)(8)(14)(29)(26)(27)(18)(7)(8)(6)(2)页面导航:
→ 正文内容 json_decode()和json_encode()
php中json_decode()和json_encode()的使用方法
json_decode对JSON格式的字符串进行编码而json_encode对变量进行 JSON 编码,需要的朋友可以参考下
1.json_decode() json_decode (PHP 5 &= 5.2.0, PECL json &= 1.2.0) json_decode ― 对 JSON 格式的字符串进行编码 说明 mixed json_decode ( string $json [, bool $assoc ] ) 接受一个 JSON 格式的字符串并且把它转换为 PHP 变量 参数 json 待解码的 json string 格式的字符串。 assoc 当该参数为 TRUE 时,将返回 array 而非 object 。 返回值 Returns an object or if the optional assoc parameter is TRUE, an associative array is instead returned. 范例 Example #1 json_decode() 的例子
代码如下: &?php $json = '{"a":1,"b":2,"c":3,"d":4,"e":5}'; var_dump(json_decode($json)); var_dump(json_decode($json, true)); ?&
上例将输出:
代码如下: object(stdClass)#1 (5) { ["a"] =& int(1) ["b"] =& int(2) ["c"] =& int(3) ["d"] =& int(4) ["e"] =& int(5) } array(5) { ["a"] =& int(1) ["b"] =& int(2) ["c"] =& int(3) ["d"] =& int(4) ["e"] =& int(5) }
代码如下: $data='[{"Name":"a1","Number":"123","Contno":"000","QQNo":""},{"Name":"a1","Number":"123","Contno":"000","QQNo":""},{"Name":"a1","Number":"123","Contno":"000","QQNo":""}]'; echo json_decode($data);
代码如下: Array ( [0] =& stdClass Object ( [Name] =& a1 [Number] =& 123 [Contno] =& 000 [QQNo] =& ) [1] =& stdClass Object ( [Name] =& a1 [Number] =& 123 [Contno] =& 000 [QQNo] =& ) [2] =& stdClass Object ( [Name] =& a1 [Number] =& 123 [Contno] =& 000 [QQNo] =& ) )
可以看出经过json_decode()编译出来的是对象,现在输出json_decode($data,true)试下
代码如下: echo json_decode($data,true);
代码如下: Array ( [0] =& Array ( [Name] =& a1 [Number] =& 123 [Contno] =& 000 [QQNo] =& ) [1] =& Array ( [Name] =& a1 [Number] =& 123 [Contno] =& 000 [QQNo] =& ) [2] =& Array ( [Name] =& a1 [Number] =& 123 [Contno] =& 000 [QQNo] =& ) )
可以看出 json_decode($data,true)输出的一个关联数组,由此可知json_decode($data)输出的是对象,而json_decode("$arr",true)是把它强制生成PHP关联数组. 2.json_encode() json_encode (PHP 5 &= 5.2.0, PECL json &= 1.2.0) json_encode ― 对变量进行 JSON 编码 Report a bug 说明 string json_encode ( mixed $value [, int $options = 0 ] ) 返回 value 值的 JSON 形式 Report a bug 参数 value 待编码的 value ,除了resource 类型之外,可以为任何数据类型 该函数只能接受 UTF-8 编码的数据 options 由以下常量组成的二进制掩码: JSON_HEX_QUOT, JSON_HEX_TAG, JSON_HEX_AMP, JSON_HEX_APOS, JSON_NUMERIC_CHECK, JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, JSON_FORCE_OBJECT, JSON_UNESCAPED_UNICODE. Report a bug 返回值 编码成功则返回一个以 JSON 形式表示的 string 或者在失败时返回 FALSE 。 Report a bug 更新日志 版本 说明 5.4.0 options 参数增加常量: JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, 和 JSON_UNESCAPED_UNICODE。 5.3.3 options 参数增加常量:JSON_NUMERIC_CHECK。 5.3.0 增加 options 参数. Report a bug 范例 Example #1 A json_encode() 的例子
代码如下: &?php $arr = array ('a'=&1,'b'=&2,'c'=&3,'d'=&4,'e'=&5); echo json_encode($arr); ?&
以上例程会输出:
代码如下: {"a":1,"b":2,"c":3,"d":4,"e":5}
Example #2 json_encode() 函数中 options 参数的用法
代码如下: &?php $a = array('&foo&',"'bar'",'"baz"','&blong&', "\xc3\xa9"); echo "Normal: ", json_encode($a), "\n"; echo "Tags: ", json_encode($a, JSON_HEX_TAG), "\n"; echo "Apos: ", json_encode($a, JSON_HEX_APOS), "\n"; echo "Quot: ", json_encode($a, JSON_HEX_QUOT), "\n"; echo "Amp: ", json_encode($a, JSON_HEX_AMP), "\n"; echo "Unicode: ", json_encode($a, JSON_UNESCAPED_UNICODE), "\n"; echo "All: ", json_encode($a, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_UNESCAPED_UNICODE), "\n\n"; $b = array(); echo "Empty array output as array: ", json_encode($b), "\n"; echo "Empty array output as object: ", json_encode($b, JSON_FORCE_OBJECT), "\n\n"; $c = array(array(1,2,3)); echo "Non-associative array output as array: ", json_encode($c), "\n"; echo "Non-associative array output as object: ", json_encode($c, JSON_FORCE_OBJECT), "\n\n"; $d = array('foo' =& 'bar', 'baz' =& 'long'); echo "Associative array always output as object: ", json_encode($d), "\n"; echo "Associative array always output as object: ", json_encode($d, JSON_FORCE_OBJECT), "\n\n"; ?&
以上例程会输出:
代码如下: Normal: ["&foo&","'bar'","\"baz\"","&blong&","\u00e9"] Tags: ["\u003Cfoo\u003E","'bar'","\"baz\"","&blong&","\u00e9"] Apos: ["&foo&","\u0027bar\u0027","\"baz\"","&blong&","\u00e9"] Quot: ["&foo&","'bar'","\u0022baz\u0022","&blong&","\u00e9"] Amp: ["&foo&","'bar'","\"baz\"","\u0026blong\u0026","\u00e9"] Unicode: ["&foo&","'bar'","\"baz\"","&blong&","é"] All: ["\u003Cfoo\u003E","\u0027bar\u0027","\u0022baz\u0022","\u0026blong\u0026","é"] Empty array output as array: [] Empty array output as object: {} Non-associative array output as array: [[1,2,3]] Non-associative array output as object: {"0":{"0":1,"1":2,"2":3}} Associative array always output as object: {"foo":"bar","baz":"long"} Associative array always output as object: {"foo":"bar","baz":"long"}
Example #3 连续与非连续数组示例
代码如下: &?php echo "连续数组".PHP_EOL; $sequential = array("foo", "bar", "baz", "blong"); var_dump( $sequential, json_encode($sequential) ); echo PHP_EOL."非连续数组".PHP_EOL; $nonsequential = array(1=&"foo", 2=&"bar", 3=&"baz", 4=&"blong"); var_dump( $nonsequential, json_encode($nonsequential) ); echo PHP_EOL."删除一个连续数组值的方式产生的非连续数组".PHP_EOL; unset($sequential[1]); var_dump( $sequential, json_encode($sequential) ); ?&
以上例程会输出:
代码如下: 连续数组 array(4) { [0]=& string(3) "foo" [1]=& string(3) "bar" [2]=& string(3) "baz" [3]=& string(5) "blong" } string(27) "["foo","bar","baz","blong"]" 非连续数组 array(4) { [1]=& string(3) "foo" [2]=& string(3) "bar" [3]=& string(3) "baz" [4]=& string(5) "blong" } string(43) "{"1":"foo","2":"bar","3":"baz","4":"blong"}" 删除一个连续数组值的方式产生的非连续数组 array(3) { [0]=& string(3) "foo" [2]=& string(3) "baz" [3]=& string(5) "blong" } string(33) "{"0":"foo","2":"baz","3":"blong"}"
代码如下: $obj-&Name= 'a1';$obj-&Number ='123'; $obj-&Contno= '000'; echo json_encode($obj);
代码如下: {"Name":"a1", "Number":"123", "Contno":"000" }
可以看出json_encode()和json_decode()是编译和反编译过程,注意json只接受utf-8编码的字符,所以json_encode()的参数必须是utf-8编码,否则会得到空字符或者null。
您可能感兴趣的文章:
上一篇:下一篇:
最 近 更 新
热 点 排 行
12345678910php代码$b=201; $c=40; $a=floor(($b+$c)&#47;2); echo $a; 执行的结果是什么_百度知道
php代码$b=201; $c=40; $a=floor(($b+$c)&#47;2); echo $a; 执行的结果是什么
$b=201;$c=40;$a=floor(($b+$c)&#47;2);echo $a; 这个代码的执行结果是什么
提问者采纳
120241/2 = 120.5floor:去掉尾数(取整)结果120
其他类似问题
为您推荐:
echo的相关知识
其他2条回答
121241/2=120.5取最小整数应该是121
$b=201;$c=40;$a=$b!=$c?10:16;echo $a;
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁请问php中$c=(-3)^3; echo $c;会输出多少?为什么?_百度知道
请问php中$c=(-3)^3; echo $c;会输出多少?为什么?
最i详细越好
提问者采纳
(-3)^3 == -2首先“^”是异或运算符3 的二进制码:00 -3的二进制码:11 异或&同0异1& :
===&其十进制值为-2注:计算机中负数以其正值的补码形式表达。
补码=反码+1
请问这个是怎么推算出等于-2的,我就在这里卡住了
二进制的负数转化为十进制:符号位不动,其余全部取反,然后换算成十进制之后+1,最后加负号参考:
提问者评价
太给力了,你的回答完美地解决了我的问题,非常感谢!
其他类似问题
结果为0,按位运算符(有人称为逻辑异或运算符)相同位取反,不同为取1,因为3是十进制它需转换为二进制并进行运算,最高的一位为符号位可忽略不计,结果就为0
请问那我输出的怎么是-2呢?
他是对的,我疏忽了一个重要关键,不要被我误导,二进制在计算时是以补码形式做的,现在仔细听我说3的原码为000011(正数补码为它自己),-3源码为补码就变为111101,因此此时开始做计算:1101,记得符号位不在计算范围(在汇编中可以把它当符号位也可以做另一种计算),结果就为11110,最后补码变原码先减一得11101,在取反得10010(因为在这里你把最高位作为符号位),这时就是正确结果-2,这都是基础,上帝啊我竟然犯了这样糊涂的事,抱歉
为您推荐:
echo的相关知识
其他1条回答
php中$c=(-3)^3; echo $c;输出-2.因为^在php中是异或运算符,也就是说在二进制中1^1=0,0^0=0,1^0=1,0^1=1我们用一个字节(即八位二进制数)为例: 3表示为二进制数是 3的二进制反码是 3的二进制补码是(是3二进制数的反码加1)-3表示为二进制数是(是3二进制数的补码)-3^3表示为二进制数的计算方法是:
(-2)所以php中$c=(-3)^3; echo $c;输出-2.
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁}

我要回帖

更多关于 php echo输出中文乱码 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信