php中static关键字对变量和函数影响
1) 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
2) 从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。
3) static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件
PHP5.3.0之后,我们可以用一个变量来动态调用类。但该变量的值不能为关键字self, parent 或static。
Example #1 静态成员代码示例
代码如下 | 复制代码 |
public function staticValue() { class Bar extends Foo
$foo = new Foo(); print $foo::$my_static . " "; print Bar::$my_static . " "; Example #2 静态方法代码示例 <?php Foo::aStaticMethod(); |
关于Static关键字在类中的使用,PHP手册给出了如下的约定:
1、声明类成员或方法为static,就可以不实例化类而直接访问。不能通过一个对象来访问其中的静态成员(静态方法除外)。
2、由于静态方法不需要通过对象即可调用,所以伪变量$this在静态方法中不可用。
3、静态属性不可以由对象通过->操作符来访问。
4、用::方式调用一个非静态方法会导致一个E_STRICT级别的错误。
现在来关注一下第4条约定。
运行环境: (Win32) PHP/5.3.3
代码如下 | 复制代码 |
class Foo{ |
面试题之static关键字
题目代码:写出以下代码的运算结果( )
代码如下 | 复制代码 |
<?php function dewen(){ function add_number($n){ |
第一眼以为就是简单地自加计算:以为结果是400,结果答案错误。最后仔细看了下,敲了一边代码,运行才知道是500。打印了两次$i+=$n;计算之前的$i,一次是100,一次是200;知道问题是static在做鬼。然后百度了一下static关键字,才恍然大悟。
static关键字作用:
PHP中static变量的使用范围要更广一些,我们不仅可以在类,方法或变量前面添加 static修饰符,我们甚至还能给函数内部变量添加static关键字。添加了static修饰符的变量即使在该函数执行完毕值仍然不会丢失,也就是说,在下一次调用这个函数时,变量仍然记得原来的值。如:
代码如下 | 复制代码 |
01 <?php 02 function test() 03 { 04 static $var1 =1; 05 $var1 +=2; 06 echo $var1 . ' ' ; 07 } 08 09 test(); 10 test(); 11 test(); 12 ?> 3 5 7 |
综上所述:
static全局变量与普通的全局变量有什么区别:
static全局变量只初使化一次,防止在其他文件单元中被引用;
static局部变量和普通局部变量有什么区别:
static局部变量只被初始化一次,下一次依据上一次结果值;
static函数与普通函数有什么区别:
static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
php中引用的用法:
1. 变量的引用赋值: $a = &$b
2. 函数调用时的引用参数传递
1) 早期php是在调用时通过&符号传递引用类型的变量, 比如: func(&$arg);
2) 后来, 函数的引用类型参数被规定为需要在函数声明时定义, 不如: function func(&$arg);
注: 引用声明时定义引用类型参数后, 运行时引用参数传递被废弃, 需要在php.ini中增加allow_call_time_pass_reference来开启.
3. 函数返回引用类型, 这种应用方式需要声明函数时, 在函数名前增加&符号, 并且, 在调用时, 要用引用赋值方式, 比如:
代码如下 | 复制代码 |
|
简而言之, 就是让函数的返回一个引用类型的值, 一个更实际的例子:
代码如下 | 复制代码 |
$a = 1; |
php函数传值的几个细节
代码如下 | 复制代码 |
//一、基本数据类型的传值 /* **************************************************** */ function testvar($k){ $k = 40; } $c = 30; //给一个函数参数传一个基本数据类型(整型,布尔,字符 ...), 实际上传的就是值 ; testvar($c); echo $c;//结果是:30 function testvar2(&$k){ $k = 40; } $e = 30; //给一个函数参数传一个基本数据类型(整型,布尔,字符 ...), 实际上传的y就是地址 ; testvar2($e); echo $e;//结果是:40 /* **************************************************** */ //二、数组(默认情况下是复制一份数据),如要传地址则&$arr. $arr1 = array(-1,5,0); function testArr($arr){ for($i=0;$i<count ($arr);$i++){ for($j=$i+1;$j<count($arr);$j++){ if($arr[$i]>$arr[$j]){ $temp = $arr[$i]; $arr[$i] = $arr[$j]; $arr[$j] = $temp; } } } print_r($arr); //结果:Array ( [0] => -1 [1] => 0 [2] => 5 ) } testArr($arr1); print_r($arr1); //结果:Array ( [0] => -1 [1] => 5 [2] => 0 ) function testArr2(&$arr){ for($i=0;$i</count><count ($arr);$i++){ for($j=$i+1;$j<count($arr);$j++){ if($arr[$i]>$arr[$j]){ $temp = $arr[$i]; $arr[$i] = $arr[$j]; $arr[$j] = $temp; } } } } testArr($arr1); print_r($arr1); //结果:Array ( [0] => -1 [1] => 0 [2] => 5 ) /* **************************************************** */ //三、对象数据类型传值 class person{ public $name; public $age; } $a = new person(); $a->name = '小明'; $a->age = '20'; //变量a在存的是对象的地址,把a赋给b这个变量,实际上就是赋了一个地址。 $b = $a; $b->age = 30; //echo $a->age.$b->age;//结果是:30 30 //给一个函数参数传一个对象, 实际上传的是这个对象的地址; function test($k){ $k->age =40; } //调用 test($b); //echo $a->age.$b->age;//结果是:40 40 </count> |
php函数的传值与传址有什么区别呢?对于这样的问题我喜欢通过程序演示来获取答案。让我们来看一个演示记录吧!
代码如下 | 复制代码 |
<?php $i=100; function func($n){ $n=$n+100; return $n; } echo '1)函数传值前变量$i的值:'.$i.'<br>'; echo '2)传值后函数的返回值:'.func($i).'<br>'; echo '3)函数传值后变量$i的值:'.$i.'<br>'; echo '4)函数传址前变量$i的值:'.$i.'<br>'; echo '5)传址后函数的返回值:'.func(&$i).'<br>'; echo '6)函数传址后变量$i的值:'.$i.'<br>'; //echo func($i).'<br>'; ?> |
程序输出:
1)函数传值前变量$i的值:100
2)传值后函数的返回值:200
3)函数传值后变量$i的值:100
4)函数传址前变量$i的值:100
5)传址后函数的返回值:200
6)函数传址后变量$i的值:200
解释:
1)直接输出一个赋值$i=100的变量
2)func函数传值返回一个算术相加的结果$=100+100
3)func函数传值,其作用区域只限于函数内部,对外面的变量$i不会有影响
4)同上
5)func函数参数前多了个"&"符,表示传址,和2)一样,返回值是函数的算术运行结果。
6)func(&$i),变量指针指向$i的位置,可以理解为是对变量$i的操作,$i=$i+100;这时变量$i已经相当于重新被赋值
如果去掉上面代码的第18行注释,会得什么结果呢?
小结:传址为了在执行函数的同时,同时改变函数参数值,而传值不期望改变。
利用php实例登入登出我们一般会借助于session来保存记录用户登录成功的信息,然后退出时我们再使用unset来清除session即可实现用户登入登出功能了,下面我来介绍一个简单的实例。关于会话处理
HTTP 是一种无状态的协议,说明每次请求的处理都与之前或之后的 请求无关,但是为了能够调整用户特有的行为和首选项,出现了一种在客户端存储少量信息(常称为cookie)的实践,但由于 cookie 大小的限制、所允许的 cookie 数量以及 cookie 的实现上的各种不一致,出现了另外一种解决方案:会话处理。
会话处理的实现方式是为每位网站访问者分配一个称之为会话 ID(SID)的唯一标识属性,然后将此 SID 与任意数量的数据关联。
开始会话
session_start();
创建会话变量
代码如下 | 复制代码 |
$_SESSION['username'] = “jason”; |
删除会话变量
代码如下 | 复制代码 |
unset($_SESSION['username']); |
简单的登入登出
代码如下 | 复制代码 |
$supervisor = "admin"; // 检查是否提交表单 |
假设将此文件命名为include.php,将其包含到要验证登入的页面即可,例如 index.php
代码如下 | 复制代码 |
<?php |
如此访问 index.php 页面时将进入登入页面,登录后显示 index.php 页面内容,这个过程一直持续到用户结束会话,如关闭浏览器或点击注销按钮,但是会话本身在PHP服务器有一个默认的生存期。
有效会话的持续时间由 php.ini 所控制,默认为1440秒,即24分钟
session.gc_maxlifetime = 1440
PS:本文是个范例,用简单的代码来做说明,实际应用中会采用更加复杂的控制机制。
本文章来给各位同学介绍一下关于php 浮点数精度值实例程序详解,希望有需要理解浮点数精度值的朋友可进入参考。php中浮点数的精度值是用来控制输出该浮点数时使用的,可以理解为控制输出的位数,精度值不同,看到输出结果也可能不一样,注意:其内部还是按照实际值存储的,当两个浮点数进行四则运算时,用的还是其本来的值。
php的配置文件中使用precision来设定全局指定浮点数的精度值,似乎每个发行版,它的默认设置都不太一样,我在window下看到是12,在linux下看到此值是14,当然也可以通过程序中使用ini_set来改变全局设置,例如:
代码如下 | 复制代码 |
ini_set("precision", "15"); |
对于精度我一直理解为小数点后保留多少,那么在php的浮点数中是这样的么?答案是否定的。
浮点数其实是整数部分和小数部分组成,这里的精度是指整数部分的位数加小数部分的位数不能超过其精度最大值,如果超过,则按照四舍五入的方法截断到最大的精度值。整数部分如果是0,则不计位数,小数部分末尾0也不计入位数。另外对于同一个数,precision的不同,可能显示的出来表现形式也不一样。下面通过例子的方式来说明。
整数部分为 0 情况
代码如下 | 复制代码 |
$num = 0.12345600000000000; ini_set("precision", "12"); ini_set("precision", "3"); ini_set("precision", "5"); |
//超过精度值,保留5位这种情况下,精度值等价于小数点后保留几位。
整数部分大于 0 情况
代码如下 | 复制代码 |
$num = 12.12345600000000000; ini_set("precision", "12"); ini_set("precision", "3"); ini_set("precision", "5"); |
。
整数部分大于 0 情况 之二
代码如下 | 复制代码 |
$num = 12345678.12345600000000000; ini_set("precision", "12"); ini_set("precision", "3"); ini_set("precision", "5"); |
//超过精度值,且整数部分位数超过精度,小数部分舍弃,且整数部分只取5位上述例子中可以看到,精度值也关系到整数部分的截取。注意到最后两个例子中显示的方式不一样,一个是使用科学计数法,一个是后面用 0 补。通过实验得出的结论是当整数部分的位数 减去 精度值 大于 4 的时候,使用科学计数法的方式,否则后面用 0 补,换句话说,就是整数部分位数超过精度值后,截断后,补 0 的个数不会超过 4 。
浮点数运算
代码如下 | 复制代码 |
$num1 = 1331625729.687; echo $num1 . ' $sub = $num1 - $num2; echo $sub . ' |
上述例子就说明了精度值只是控制显示结果,内部存储还是原始值,所以 $sub 的值为1331625729.687减1331625730.934。
PHP内置的echo, var_dump, json_encode, 字符串拼接等函数(指令)在显示浮点数时都有问题, 导致精度丢失.
代码如下 | 复制代码 |
<?php $a = 1315537636.338467; printf("%f", $a); echo "n"; echo $a . "n"; echo $a; echo "n"; ?> 结果 1315537636.338467 1315537636.3385 1315537636.3385 |
也就是说, 用PHP最顺手的方法将浮点数转成字符串或者显示是不行的, 必须使用printf/sprintf将浮点数转成字符串.
在php中文件操作无非就是文件的读写操作,删除操作,判断操作,权限操作以及一些文件查找等等,下面我来把我学习到的php文件操作函数给大家贴出来吧。文件操作函数
1、获取文件名:basename();
2、获取文件所在的目录:dirname();
3、pathinfo()获取文件信息,返回结果为一个array,包括路径、文件全名、文件名和扩展名。例如:
代码如下 | 复制代码 |
$file = '/com/netingcn/error.log'; |
4、判断文件是否存在:is_file();
5、判断目录是否存在:is_dir();
6、判断文件或目录是否存在:file_exists();
7、读取文件所有内容:file()或file_get_contents(),其中file()返回的是一个一行为元素的array,file_get_contents()把文件全部内容作为一个String返回;
8、写文件fwrite,如:
代码如下 | 复制代码 |
$handler = fopen($file, 'w'); // w 会冲掉以前的内容、a 是追加 |
下面简单介绍几个:
代码如下 | 复制代码 |
$handler = fopen($file, 'r'); while(!feof($handler)) { while(!feof($handler)) { while(!feof($handler)) { $content = fread($handler, $strLength); //读取指定长读的字符 fclose($handler); |
php读取文件操作函数
1.用fread()获取
请看下面php代码:
代码如下 | 复制代码 |
<?php $file = "phpddt.txt"; $fp = fopen($file,"r"); if ($fp){ while(!feof($fp)){ //第二个参数为读取的长度 $data = fread($fp, 1000); } fclose($fp); } echo $data; ?> |
运行结果:
php点点通(www.111cn.net),关注php开发,提供专业php教程!
2.fseek ( resource handle, int offset [, int whence] ),将指针偏移到偏移量offset处。
(php.txt内容是【Welcome to www.111cn.net】)
运行下面php代码后:
代码如下 | 复制代码 |
|
结果为:
to www.111cn.net
对whence参数说明如下:
SEEK_SET - 设定位置等于 offset 字节。
SEEK_CUR - 设定位置为当前位置加上 offset。
SEEK_END - 设定位置为文件尾加上 offset。(赋值)
如果没有指定 whence,默认为 SEEK_SET。
3.ftell()函数用于获取指针位置的偏移量
php演示代码如下:
代码如下 | 复制代码 |
|
运行结果:
8
4.rewind()函数将文件指针移至指定位置
5.parse_ini_file()函数,解析.ini文件,轻松解析多维数组。看下面php教程就了解了!
首先保存phpddt.ini文件,文件的内容如下:
[web1]
url= "www.111cn.net"
name = php点点通
[web2]
url= "www.baidu.com"
name = 百度搜索
编写如下php代码:
代码如下 | 复制代码 |
|
运行结果如下:
Array
(
[web1] => Array
(
[url] => www.111cn.net
[name] => php点点通
)
[web2] => Array
(
[url] => www.baidu.com
[name] => 百度搜索
)
)
目录操作
首先介绍的是一个从目录读取的函数,opendir(),readdir(),closedir(),使用的时候是先打开文件句柄,而后迭代列出:
代码如下 | 复制代码 |
<?php |
这是讲返回文件目录下面的文件已经目录的程序(0文件将返回false).
有时候需要知道目录的信息,可以使用dirname($path)和basename($path),分别返回路径的目录部分和文件名名称部分,可用disk_free_space($path)返回看空间空余空间.
创建命令:
代码如下 | 复制代码 |
mkdir($path,0777) |
,0777是权限码,在非window下可用umask()函数设置.
rmdir($path)
将删除路径在$path的文件.
dir -- directory 类也是操作文件目录的重要类,有3个方法,read,rewind,close,这是一个仿面向对象的类,它先使用的是打开文件句柄,然后用指针的方式读取的.,这里看php手册:
代码如下 | 复制代码 |
<?php |
输出:
Handle: Resource id #2
Path: /etc/php5
.
..
apache
cgi
cli
文件的属性也非常重要,文件属性包括创建时间,最后修改时间,所有者,文件组,类型,大小等.
下面我们重点谈文件操作.
三、文件操作
● 读文件
首先是一个文件看能不能读取(权限问题),或者存在不,我们可以用is_readable函数获取信息.:
代码如下 | 复制代码 |
<?php |
判断文件存在的函数还有file_exists(下面演示),但是这个显然无is_readable全面.,当一个文件存在的话可以用
代码如下 | 复制代码 |
<?php |
但是file_get_contents函数在较低版本上不支持,可以先创建文件的一个句柄,然后用指针读取全部:
$fso = fopen($cacheFile, 'r');
$data = fread($fso, filesize($cacheFile));
fclose($fso);
还有一种方式,可以读取二进制的文件:
$data = implode('', file($file));
● 写文件
和读取文件的方式一样,先看看是不是能写:
代码如下 | 复制代码 |
<?php $file = 'dirlist.php'; |
能写了的话可以使用file_put_contents函数写入:
代码如下 | 复制代码 |
<?php |
file_put_contents函数在php5中新引进的函数(不知道存在的话用function_exists函数先判断一下)低版本的php无法使用,可以使用如下方式:
$f = fopen($file, 'w');
fwrite($f, $data);
fclose($f);
替换之.
写文件的时候有时候需要锁定,然后写:
代码如下 | 复制代码 |
function cache_page($pageurl,$pagedata){ |
● 复制,删除文件
php删除文件非常easy,用unlink函数简单操作:
代码如下 | 复制代码 |
<?php |
即可.
复制文件也很容易:
代码如下 | 复制代码 |
<?php |
可以使用rename()函数重命名一个文件夹.其他操作都是这几个函数组合一下就能实现的.
● 获取文件属性
我说几个常见的函数:
获取最近修改时间:
代码如下 | 复制代码 |
<?php |
返回的说unix的时间戳,这在缓存技术常用.
相关的还有获取上次被访问的时间fileatime(),filectime()当文件的权限,所有者,所有组或其它 inode 中的元数据被更新时间,fileowner()函数返回文件所有者
$owner = posix_getpwuid(fileowner($file));
(非window系统),ileperms()获取文件的权限,
代码如下 | 复制代码 |
<?php |
filesize()返回文件大小的字节数:
代码如下 | 复制代码 |
<?php // 输出类似:somefile.txt: 1024 bytes $filename = 'somefile.txt'; ?> |
获取文件的全部信息有个返回数组的函数stat()函数:
代码如下 | 复制代码 |
<?php |
相关文章
- eval函数在php中是一个函数并不是系统组件函数,我们在php.ini中的disable_functions是无法禁止它的,因这他不是一个php_function哦。 eval()针对php安全来说具有很...2016-11-25
- 在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
- 下面本文章来给大家介绍在php中成员变量的一些对比了,文章举了四个例子在这例子中分别对不同成员变量进行测试与获取操作,下面一起来看看。 有如下4个代码示例,你认...2016-11-25
Python astype(np.float)函数使用方法解析
这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08- 这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
- 本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
- 本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
- 下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
- 这篇文章主要介绍了R语言删除指定变量或对象的操作方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
- CREATE FUNCTION ChangeBigSmall (@ChangeMoney money) RETURNS VarChar(100) AS BEGIN Declare @String1 char(20) Declare @String2 char...2016-11-25
- 这篇文章主要介绍了C# 中的var关键字详细介绍的相关资料,需要的朋友可以参考下...2020-06-25
解决vue的router组件component在import时不能使用变量问题
这篇文章主要介绍了解决vue的router组件component在import时不能使用变量问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-27- 这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
Android开发中findViewById()函数用法与简化
findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20- strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 false。语法:strstr(string,search)参数string,必需。规定被搜索的字符串。 参数sea...2013-10-04
- 这篇文章主要介绍了Vue select 绑定动态变量的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-10-23
PHP函数分享之curl方式取得数据、模拟登陆、POST数据
废话不多说直接上代码复制代码 代码如下:/********************** curl 系列 ***********************///直接通过curl方式取得数据(包含POST、HEADER等)/* * $url: 如果非数组,则为http;如是数组,则为https * $header:...2014-06-07- Foreach 函数(PHP4/PHP5)foreach 语法结构提供了遍历数组的简单方式。foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。...2013-09-28
- 在PHP中,大部分变量类型,如字符串,整型,浮点,数组等都是值类型的,而类和对象是引用类型,在使用的时候,需要注意这一点。看到网友在讨论PHP的&符号,要彻底理解它的用法,就有必要讨论一下变量的两种形式。PHP的变量在内存中是这样...2015-10-23
- free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25