Chinaunix

标题: [问题]Smarty中register_function()的问题:&$smarty有什么含意? [打印本页]

作者: cjcameron    时间: 2006-10-13 16:00
标题: [问题]Smarty中register_function()的问题:&$smarty有什么含意?
同样是手册里的一个例子,如下:

Example 13-1. register_function()

<?php
$smarty->register_function('date_now', 'print_current_date');

function print_current_date($params, &$smarty)
{
  if(empty($params['format'])) {
    $format = "%b %e, %Y";
  } else {
    $format = $params['format'];
  }
  return strftime($format,time());
}
?>  

And in the template

{date_now}

{* or to format differently *}
{date_now format="%Y/%m/%d"}


首先,&$smarty是什么含意?在变量前面为什么加&?
另外,function print_current_date($params, &$smarty)中的&$smarty参数怎么在函数定义中没用到啊?
作者: crazysoul    时间: 2006-10-14 12:06
引用,同一个页面请求内使用同一个变量源值,意图是减少变量的复制(优化手段)。
作者: cjcameron    时间: 2006-10-16 19:17
标题: To: crazysoul
谢谢指点!我查了php手册关于引用这部分的内容,但是还是对它的概念不太理解。
比如,其中说:“
PHP 的引用允许你用两个变量来指向同一个内容。意思是,当你这样做时:
<?php
$a =& $b
?>
这意味着 $a 和 $b 指向了同一个变量。
注: $a 和 $b 在这里是完全相同的,这并不是 $a 指向了 $b 或者相反,而是 $a 和 $b 指向了同一个地方。”

于是我把上面这个例子的代码作了如下修改:
<?php
$a=7;

$a =& $b;

echo $b;
?>

自己想象应该输出“7”,但结果什么都没有,我不理解,情节是一下吧
作者: james.liu    时间: 2006-10-16 20:28
<?php
$a=7;

$b =& $a;

echo $b;
?>
作者: kirkcolors    时间: 2006-10-16 23:17
学过C么..理解为指针吧
作者: xuzuning    时间: 2006-10-17 09:01
!、&$smarty用于传递smarty的实例。既然函数被注册为smarty的方法,那么函数中就可能需要使用smarty的其他方法和属性。通过$smarty就可以访问到当前smarty实例
2、&$smarty中的&表示传引用,如果只是传值的话,函数中对smarty实例属性的任何改变都将无效
3、这个&$smarty是php4的写法,php5由于对象总是以引用方式传递,可以写做$smarty
4、$a =& $b;表示$a和$b指向同一个地方,由于在之前$b并没有赋值,所以$a也就没有值了。对于这点的理解只需理解$a = $b;
作者: cjcameron    时间: 2006-10-17 21:14
标题: To: xuzuning
谢谢,讲得很具体。不过我基础差,得好好捉摸一下~~还有个问题如下:

php手册里“引用”这部分的“引用传递”小节里有关于“从函数中返回的引用”这个例子:

<?php
function &bar()
{
    $a = 5;
    return $a;
}
foo(bar());
?>

没看出来这个例子要说明什么问题,给解释一下吧
作者: cjcameron    时间: 2006-10-18 10:06
标题: To: kirkcolors
学过C,但基础差。手册里一直强调引用不同于指针啊
作者: xuzuning    时间: 2006-10-18 16:11
手册上的那个例子不能说明什么问题
解释引用的返回用这个例子较好
  1. function &foo() {
  2.   static $var;
  3.   return $var;
  4. }

  5. $a =& foo();
  6. $a++;
  7. echo foo();
复制代码


在C中,指针指向了内存中真实的物理地址,通过指针的运算,可以从一个地址出发访问整个内存
php的变量都以stdClass对象形式存放在一个表中,引用使得两个以上变量指向同一个表项。我们也不可能从一个变量出发去访问另一个变量

这就是“引用不同于指针”的关键所在
撇开这点以后,引用的表现与指针还是很相似的
作者: cjcameron    时间: 2006-10-20 19:43
标题: To: xuzuning
实在不好意思,你举的这个例子我还是不明白为什么运行结果是1。
function &foo()   这里比普通函数声明多了一个&,这是什么意思?为什么把&去掉,输出结果就为空了?
能否把你举的这个例子每句都注释以下解释,我的基本概念还没有在头脑中形成。

多谢了!!

[ 本帖最后由 cjcameron 于 2006-10-20 20:32 编辑 ]




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2