php获取mssql存储过程的输出参数,代码如下:
$conn=mssql_connect("127.0.0.1","user","passwd");
mssql_select_db("mydb");
$stmt=mssql_init("pr_name",$conn);//
$a=50001;
mssql_bind($stmt,"RETVAL",$val,SQLVARCHAR); //用于直接返回return -103此类的值。
mssql_bind($stmt,"@outvar",$b,SQLVARCHAR,true);//用于返回在存储过程中定义的输出参数
mssql_bind($stmt,"@invar",$a,SQLINT4);
$result = mssql_execute($stmt,true);//不能返回结果集,只能得到输出参数
//$result = mssql_execute($stmt,false); //返回结果集
//$records=mssql_fetch_array($result);
//print_r($records);
//mssql_next_result($result);下一个结果集,当等于FALSE的时候下一个就是输出参数
echo $b;
echo $val;
?>
问题:按照惯例使用了一个MS Sql Server的存储过程procA,它给出了一个输出参数nReturn,而且返回了一个结果集。
在如何让PHP调用这个procA时,有些小问题。
本来希望这样的代码能够既得到输出参数,又得到返回的结果集:
// 初始化要传进存储过程的参数们:
$nYear = 2004;
$nPageSize = 20;
$nPageNo = 1;
// Initializes a stored procedure:
$stmt = mssql_init("proc_stat_page", $db_mssql->Link_ID);
// 绑定输入参数:
mssql_bind($stmt, "@nReturn", $nReturn, SQLINT4, TRUE);
mssql_bind($stmt, "@nYear", $nYear, SQLINT4);
mssql_bind($stmt, "@nPageSize", $nPageSize, SQLINT4);
mssql_bind($stmt, "@nPageNo", $nPageNo, SQLINT4);
// 执行存储过程,得到QueryID:
$db_mssql->Query_ID = mssql_execute($stmt,false);
?>
虽然得到了结果集,但是,这样$nReturn参数是拿不到输出参数的。
如果把最后一句话改为:
输出参数倒是拿到了,结果集又没有了。
解决:
在最后我们补上一句话:
mssql_next_result($db_mssql->Query_ID);
立刻,魔法生效了:
PHP填充了正确的输出参数到$nRetVal里。
1,函数体、函数作用域、超全局变量
函数的返回值,函数体内的 return语句。
1,返回值,2,终止执行(终止的函数的执行)
只要出return 就不会出现执行后面的脚本。
除非在分支结构中的return。
一个函数只能有一个返回值:
但是可以有多个return语句。
返回值也存在 值传递和引用传递。
默认是值传递。可以使用引用传递:
1,在定义函数时,告知函数需要返回一个引用。
return "";
}
2.在调用时,在函数前增加引用符号。
PHP的作用域只有两种
1, 函数外,全局作用域。
2, 函数内,局部作用域。
法则:作用域不重叠。(全局不能访问局部,局部不能访问全局)
但是js是可重叠的。
特殊的:预定义变量(9大超全局数组变量)--注意是数组变量。
超全局:超级全局:既可以在全局使用,也可以在局部使用。所有的作用域都生效。
echo $_GET['v1']
$GLOBALS 超级全局变量,是专门保存超全局变量的,注意没有下划线。
修改全局变量,会影响GLOBALS内元素的值;
原因:使用的一个数据空间。
相当于:
2. create_function -- 创建函数的另一方式
var_dump($func); 返回一个函数名。
次函数创建出来的函数名 为lambda风格。而且在函数名前有一个 不可见字符。Ascii为0的不可见字符。
也可以调用。 $result = ”\x0“."lamba8"(20); 注意要知道函数名才可调用。
最常用的地方出现在回调函数内。
因此 create_function所创建的函数,与普通函没有区别(存在函数的三个部分);
但是此函数不可以在定以前 调用,因此 只用执行 create_function才能得到该函数。
最常用的地方:
在 callback参数上,参数create_function
相当于一个回调结构入参。
匿名函数:
匿名函数 创建的函数是没有名的, 而是一个 对象:
与create_function的区别:
匿名函数究竟是什么?
1, 将匿名函数可以当值来看待(php中是对象类型的)
2, Php是通过 类 closure 类来实现匿名函数功能的。每一个匿名函数都是Closure类一个对象。Closure单词的意思是闭包。因此有时php也将 匿名函数称之为 闭包函数。
3, 为什么一个对象可以当函数来调用?(oop)
可以使用 外层作用域的变量的语法:
注意:
外层与全局的区别。外层可能是全局,也可能是局部。看当前匿名函数是定义的位置。
Use语法默认是值传递,可以引用传递.
Callback
1, 函数名
2, Create_function
3, Function 匿名函数
在php面向对象的编程中,总是把类的属性定义为private。
但是,对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数“__get()”和“__set()”来获取和赋值其属性。
类似于java中的javabean的操作,使用的方法也类似,只是不需要像javabean中那样,对每个字段进行set和get的操作。
只需要加上两个魔术方法即可。即私有成员的设值和取值的操作。
在PHP5中提供了专门为属性设置值和获取值的方法,“__set()”和“__get()”这两个方法,这两个方法不是默认存在的,需要手工添加到类中,像构造方法(__construct())一样,在类中添加了才会存在。
可以按下面的方式来添加这两个方法,当然也可以按个人的风格来添加:
//__set()方法用来设置私有属性
public function __set($name,$value){
$this->$name = $value;
}
//__get()方法用来获取私有属性
public function __get($name){
return $this->$name;
}
?>
__get()方法:这个方法用来获取私有成员属性值的,有一个参数,参数传入你要获取的成员属性的名称,返回获取的属性值,这个方法不用我们手工的去调用,因为我们也可以把这个方法做成私有的方法,是在直接获取私有属性的时候对象自动调用的。因为私有属性已经被封装上了,是不能直接获取值的,但是如果你在类里面加上了这个方法,在使用“echo$p1->name”这样的语句直接获取值的时候就会自动调用__get($name)方法,将属性name传给参数$name,通过这个方法的内部执行,返回我们传入的私有属性的值。如果成员属性不封装成私有的,对象本身就不会去自动调用这个方法。
__set()方法:这个方法用来为私有成员属性设置值的,有两个参数,第一个参数为你要为设置值的属性名,第二个参数是要给属性设置的值,没有返回值。这个方法同样不用我们手工去调用,它也可以做成私有的,是在直接设置私有属性值的时候自动调用的,同样属性私有的已经被封装上了,如果没有__set()这个方法,是不允许的,比如:$this->name=‘zhangsan’,这样会出错,如果在类里面加上了__set($property_name, $value)这个方法,在直接给私有属性赋值的时候,就会自动调用它,把属性比如name传给$property_name,把要赋的值“zhangsan”传给$value,通过这个方法的执行,达到赋值的目的。
如果成员属性不封装成私有的,对象本身就不会去自动调用这个方法。为了不传入非法的值,还可以在这个方法给做一下判断。
例如:
class Person
{
//人的成员属性,都是封装的私有成员
private $name; //人的名子
private $sex; //人的性别
private $age; //人的年龄
//__get()方法用来获取私有属性
private function __get($property_name)
{
echo "在直接获取私有属性值的时候,自动调用了这个__get()方法<br>";
if(isset()($this->$property_name))
{
return($this->$property_name);
}
else
{
return(NULL);
}
}
//__set()方法用来设置私有属性
private function __set($property_name, $value)
{
echo "在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值<br>";
$this->$property_name = $value;
}
}
$p1=newPerson();
//直接为私有属性赋值的操作,会自动调用__set()方法进行赋值
$p1->name="张三";
$p1->sex="男";
$p1->age=20;
//直接获取私有属性的值,会自动调用__get()方法,返回成员属性的值
echo "姓名:".$p1->name."<br>";
echo "性别:".$p1->sex."<br>";
echo "年龄:".$p1->age."<br>";
?>
程序执行结果:
在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值
在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值
在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值
在直接获取私有属性值的时候,自动调用了这个__get()方法
姓名:张三
在直接获取私有属性值的时候,自动调用了这个__get()方法
性别:男
在直接获取私有属性值的时候,自动调用了这个__get()方法
年龄:20
以上代码,如果不加上__get()和__set()方法,程序就会出错,因为不能在类的外部操作私有成员,而上面的代码是通过自动调用__get()和__set()方法来直接存取封装的私有成员的。
就介绍这些了,希望有助于大家理解__get()与__set()的用法。