php 指定传递html 参数传递

打酱油震惊呵呵赞鄙视标签: ,,注:与内容无关的评论将被删除,严重者禁用帐号! | 最新评论到底什么是实例化类呢?这里有详细的/write/864.html的说明栏目推荐关注 第一PHP社区 微信公众号热门点击本站推荐
| 中国最专业的PHP中文社区 |
Copyright (C) 1998 - . All Rights Reserved
第一PHP社区
版权所有 快云为本站提供专业云计算服务 &&&&&PHP扩展中如何传递参数
函数形式模版如下:
proto string self_concat(string str, int n)
PHP_FUNCTION(self_concat)
*str = NULL;
argc = ZEND_NUM_ARGS();
(zend_parse_parameters(argc TSRMLS_CC, "sl", &str,
&str_len, &n) == FAILURE)
php_error(E_WARNING, "self_concat: not yet
implemented");
&zend_parse_parameters()API函数
为了获得函数传递的参数,可以使用zend_parse_parameters()API函数。下面是该函数的原型:
zend_parse_parameters(int num_args TSRMLS_DC, char *type_spec,
第一个参数是传递给函数的参数个数。通常的做法是传给它ZEND_NUM_ARGS()。这是一个表示传递给函数参数总个数的宏。第二个参数是为了线程安全,总是传递TSRMLS_CC宏,后面会讲到。第三个参数是一个字符串,指定了函数期望的参数类型,后面紧跟着需要随参数值更新的变量列表。因为PHP采用松散的变量定义和动态的类型判断,这样做就使得把不同类型的参数转化为期望的类型成为可能。例如,如果用户传递一个整数变量,可函数需要一个浮点数,那么zend_parse_parameters()就会自动地把整数转换为相应的浮点数。如果实际值无法转换成期望类型(比如整形到数组形),会触发一个警告。
下表列出了可能指定的类型。我们从完整性考虑也列出了一些没有讨论到的类型。
类型指定符
对应的C类型
二进制字符串,长度
逻辑型(1或0)
资源(文件指针,数据库连接等)
任何类型的对象
指定类型的对象。需要提供目标对象的类类型
无任何操作的zval
注意:s类型时在后面的参数传中,必须是连续两个参数,一个是字符串指针,一个是字符串长度.
为了容易地理解最后几个选项的含义,你需要知道zval是Zend引擎的值容器。无论这个变量是布尔型,字符串型或者其他任何类型,其信息总会包含在一个zval联合体中。本章中我们不直接存取zval,而是通过一些附加的宏来操作。下面的是或多或少在C中的zval,
以便我们能更好地理解接下来的代码。
typedef union _zval {
HashTable *
zend_object_
在我们的例子中,我们用基本类型调用zend_parse_parameters(),以本地C类型的方式取得函数参数的值,而不是用zval容器。
为了让zend_parse_parameters()能够改变传递给它的参数的值,并返回这个改变值,需要传递一个引用。仔细查看一下self_concat():
(zend_parse_parameters(argc TSRMLS_CC, "sl", &str,
&str_len, &n) == FAILURE)
&&&&注意到自动生成的代码会检测函数的返回值FAILUER(成功即SUCCESS)来判断是否成功。如果没有成功则立即返回,并且zend_parse_parameters()负责触发警告信息。因为函数打算接收一个字符串l和一个整数n,所以指定
”sl” 作为其类型指示符。s需要两个参数,所以我们传递参考char * 和
int (str 和
str_len)给zend_parse_parameters()函数。无论什么时候,记得总是在代码中使用字符串长度str_len来确保函数工作在二进制安全的环境中。不要使用strlen()和strcpy(),除非你不介意函数在二进制字符串下不能工作。二进制字符串是包含有nulls的字符串。二进制格式包括图象文件,压缩文件,可执行文件和更多的其他文件。”l”
只需要一个参数,所以我们传递给它n的引用。尽管为了清晰起见,骨架脚本生成的C变量名与在函数原型定义文件中的参数名一样;这样做不是必须的,尽管在实践中鼓励这样做。
回到转换规则中来。下面三个对self_concat()函数的调用使str,
str_len和n得到同样的值:
self_concat("321", 5);
self_concat(321, "5");
self_concat("321", "5");
points to the string "321", str_len equals 3, and n equals
指向字符串"321",str_len等于3,n等于5。
在我们编写代码来实现连接字符串返回给PHP的函数前,还得谈谈两个重要的话题:内存管理、从PHP内部返回函数值所使用的API。
用于从堆中分配内存的PHP API几乎和标准C
API一样。在编写扩展的时候,使用下面与C对应(因此不必再解释)的API函数:
emalloc(size_t size);
efree(void *ptr);
ecalloc(size_t nmemb, size_t size);
erealloc(void *ptr, size_t size);
estrdup(const char *s);
estrndup(const char *s, unsigned int length);
在这一点上,任何一位有经验的C程序员应该象这样思考一下:“什么?标准C没有strndup()?”是的,这是正确的,因为GNU扩展通常在Linux下可用。estrndup()只是PHP下的一个特殊函数。它的行为与estrdup()相似,但是可以指定字符串重复的次数(不需要结束空字符),同时是二进制安全的。这是推荐使用estrndup()而不是estrdup()的原因。
在几乎所有的情况下,你应该使用这些内存分配函数。有一些情况,即扩展需要分配在请求中永久存在的内存,从而不得不使用malloc(),但是除非你知道你在做什么,你应该始终使用以上的函数。如果没有使用这些内存函数,而相反使用标准C函数分配的内存返回给脚本引擎,那么PHP会崩溃。
这些函数的优点是:任何分配的内存在偶然情况下如果没有被释放,则会在页面请求的最后被释放。因此,真正的内存泄漏不会产生。然而,不要依赖这一机制,从调试和性能两个原因来考虑,应当确保释放应该释放的内存。剩下的优点是在多线程环境下性能的提高,调试模式下检测内存错误等。
还有一个重要的原因,你不需要检查这些内存分配函数的返回值是否为null。当内存分配失败,它们会发出E_ERROR错误,从而决不会返回到扩展。
PHP函数中返回值
扩展API包含丰富的用于从函数中返回值的宏。这些宏有两种主要风格:第一种是RETVAL_type()形式,它设置了返回值但C代码继续执行。这通常使用在把控制交给脚本引擎前还希望做的一些清理工作的时候使用,然后再使用C的返回声明
”return”
返回到PHP;后一个宏更加普遍,其形式是RETURN_type(),他设置了返回类型,同时返回控制到PHP。下表解释了大多数存在的宏。
设置返回值并且结束函数
设置返回值
宏返回类型和参数
RETURN_LONG(l)
RETVAL_LONG(l)
RETURN_BOOL(b)
RETVAL_BOOL(b)
布尔数(1或0)
RETURN_NULL()
RETVAL_NULL()
RETURN_DOUBLE(d)
RETVAL_DOUBLE(d)
RETURN_STRING(s, dup)
RETVAL_STRING(s, dup)
字符串。如果dup为1,引擎会调用estrdup()重复s,使用拷贝。如果dup为0,就使用s
RETURN_STRINGL(s, l, dup)
RETVAL_STRINGL(s, l, dup)
长度为l的字符串值。与上一个宏一样,但因为s的长度被指定,所以速度更快。
RETURN_TRUE
RETVAL_TRUE
返回布尔值true。注意到这个宏没有括号。
RETURN_FALSE
RETVAL_FALSE
返回布尔值false。注意到这个宏没有括号。
RETURN_RESOURCE(r)
RETVAL_RESOURCE(r)
资源句柄。
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。PHP命令行脚本接收传入参数的三种方式
通常都做http方式请求了,可以使用GET or POST方式接收参数,有些时候需要在shell命令下把当作脚本执行,比如定时任务。这就涉及到在shell命令下如何给php传参的问题,通常有三种方式传参。
一、使用$argv or $argc参数接收
&* 使用 $argc $argv 接受参数
echo "接收到{$argc}个参数";
print_r($argv);
[root@DELL113 lee]# /usr/local/php/bin/php test.php
接收到1个参数Array
&&& [0] =& test.php
[root@DELL113 lee]# /usr/local/php/bin/php test.php a b c d
接收到5个参数Array
&&& [0] =& test.php
&&& [1] =& a
&&& [2] =& b
&&& [3] =& c
&&& [4] =& d
[root@DELL113 lee]#
二、使用getopt函数
&* 使用 getopt函数
$param_arr = getopt('a:b:');
print_r($param_arr);
[root@DELL113 lee]# /usr/local/php/bin/php test.php -a 345
&&& [a] =& 345
[root@DELL113 lee]# /usr/local/php/bin/php test.php -a 345 -b 12q3
&&& [a] =& 345
&&& [b] =& 12q3
[root@DELL113 lee]# /usr/local/php/bin/php test.php -a 345 -b 12q3 -e 3322ff
&&& [a] =& 345
&&& [b] =& 12q3
三、提示用户输入
&* 提示用户输入,类似Python
fwrite(STDOUT,'请输入您的博客名:');
echo '您输入的信息是:'.fgets(STDIN);
[root@DELL113 lee]# /usr/local/php/bin/php test.php
请输入您的博客名:网管之家
您输入的信息是:网管之家
你也可以这么干,不让用户输入空信息
&* 提示用户输入,类似Python
fwrite(STDOUT,'请输入您的博客名:');
fwrite(STDOUT,'抱歉,博客名不能为空,请重新输入您的博客名:');
$name = trim(fgets(STDIN));
}while(!$name);
echo '您输入的信息是:'.$name."\r\n";
[root@DELL113 lee]# /usr/local/php/bin/php test.php
请输入您的博客名:
抱歉,博客名不能为空,请重新输入您的博客名:网管之家
您输入的信息是:网管之家
顶一下(0) 踩一下(0)
热门标签:2013年5月 总版技术专家分月排行榜第一
2016年7月 总版技术专家分月排行榜第二2016年3月 总版技术专家分月排行榜第二2015年12月 总版技术专家分月排行榜第二2014年8月 总版技术专家分月排行榜第二2014年7月 总版技术专家分月排行榜第二2013年6月 总版技术专家分月排行榜第二
2017年1月 总版技术专家分月排行榜第三
2017年1月 PHP大版内专家分月排行榜第一
2013年5月 总版技术专家分月排行榜第一
2016年7月 总版技术专家分月排行榜第二2016年3月 总版技术专家分月排行榜第二2015年12月 总版技术专家分月排行榜第二2014年8月 总版技术专家分月排行榜第二2014年7月 总版技术专家分月排行榜第二2013年6月 总版技术专家分月排行榜第二
2013年5月 总版技术专家分月排行榜第一
2016年7月 总版技术专家分月排行榜第二2016年3月 总版技术专家分月排行榜第二2015年12月 总版技术专家分月排行榜第二2014年8月 总版技术专家分月排行榜第二2014年7月 总版技术专家分月排行榜第二2013年6月 总版技术专家分月排行榜第二
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。PHP伪静态隐藏传递的参数名的四种方法(4)
伪静态方法四:
&?php //伪静态方法四 //利用server变量 取得PATH_INFO信息 该例中为 /1,100,8630.html 也就是执行脚本名后面的部分 if(@$path_info =$_SERVER[&PATH_INFO&]){ //正则匹配一下参数 if(preg_match(&/\/(\d+),(\d+),(\d+)\.html/si&,$path_info,$arr_path)){ $gid=intval($arr_path[1]); //取得值 1 $sid=intval($arr_path[2]); //取得值100 $softid=intval($arr_path[3]); //取得值8630 }else die(&Path:Error!&); //相当于soft.php?gid=1&sid=100&softid=8630 }else die('Path:Nothing!'); ?&
最新图文推荐
最新专栏文章
大家感兴趣的内容
网友热评的文章
seajs.config({
base: "/resource/passapi/scripts/"
seajs.use('seajs/seajs-css');
seajs.use(['artdialog/src/dialog-plus'], function (dialog) {
$('#favorite').on('click', function(){
$.getJSON('/passapi.ashx?op=userstatus&callback=?', function(data){
if (data.status == 1) {
var _this = $('#favorite').find('span');
$.getJSON('/?app=favorite&controller=favorite&action=add&jsoncallback=?&contentid='+contentid, function(json){
if(json.state){
_this.html('

我要回帖

更多关于 html 参数传递 的文章

 

随机推荐