是否可以轻松地在PHP中“符号化”一个函数 - 或者将名称别名为别的?

时间:2008-11-26 01:47:44

标签: php

例如,我讨厌打字:

$x = mysql_escape_string(stripslashes($_GET['x']));

有没有办法在init.php或其他东西中对这两个函数进行别名而不编写一个单独的函数,该函数接受一个参数并返回那些应用了那些函数的参数?

我的C / C ++不是很好,但我认为这有点像#typedef但是对于函数来说?

8 个答案:

答案 0 :(得分:8)

我希望您的示例不代表您的项目。

  1. stripslashes()不一定是必要的 - 如果你发现它,请关闭php.ini中的magic_quotes_gpc
  2. 您应该使用mysql_real_escape_string()(或prepare / execute对)代替mysql_escape_string(),它应该是您的SQL汇编的地方,而不是您所在的位置从URL中检索值。
  3. 解决这两个问题并将代码退化为

    $x = $_GET['x'];
    

答案 1 :(得分:4)

function myget($string)
{
  return mysql_real_escape_string(stripslashes($_GET[$string]));
}

这是PHP中的解决方案。

答案 2 :(得分:2)

这应该可以解决问题:

// Macros
$mes = "mysql_escape_string";
$ss = "stripslashes";

// Using your macros
$x = $mes($ss($_GET['x']));

虽然我不建议这样编码。

我只是在回答这个问题,因为你说你不想创建任何新功能并获得类似“#define”的功能。

答案 3 :(得分:2)

我会考虑Bill Karwin的建议,但我想补充一点,我认为这很重要。

如果你想用c(...)替换对(b(...))的重复调用,那么c本身就有一些含义 - 除了简单的构图。想想上下文,以及如何命名这样的函数。通常它会有一些自己的语义,并不特别依赖于a,b - 这只是一个实现。如果是这种情况,那么很容易将其视为一个(简单的)函数,它本身就是通过调用b然后执行a来实现的。在这种情况下的简单性可能诱使你想要“别名”一个函数,但在一般情况下,这可能不太有帮助。

现在在这个特殊情况下我会想:

  • 这个复合函数的名称是什么?
  • 为什么没有人这样做?
  • 为什么我不使用查询参数?

严重。这正是您应该使用查询参数来降低SQL注入攻击风险的原因。比你在这里尝试的更可靠。

答案 4 :(得分:1)

您可以使用create_function执行匿名功能:

$newFunc = create_function('', 'return mysql_escape_string(stripslashes($_GET[\'x\']));');
$newFunc();

答案 5 :(得分:0)

如果你想要一个1:1的函数映射,这是有效的,它使回溯有点讨厌,但工作

class DB
{ 
    public static function escape()
    { 
       $args = func_get_args();  
       return call_user_func_array('mysql_real_escape_string', $args ); 
    }
}

DB::escape( $foo ); 

现在我在这里使用了func_get_args / call技巧只有一个原因:

此表示法应适用于任何功能。

直接链接它会更加优化

class DB
{ 
   public static function escape($string)
   { 
      return mysql_real_escape_string( $string ); 
   }
}

并且没有充分的理由去剥斜杠,除非你在启用php的那个可怕的“功能”中自动斜杠输入。

class DB
{ 
   public static function un_gpc($string)
   {
      if( get_magic_quotes_gpc() === 1 )
      {
         return stripslashes( $string ); 
      }
      return $string;
   }
   public static function escape($string, $quote=false)
   {
      if( !$quote )
      { 
            return mysql_real_escape_string( $string ); 
      }
      return '"' . self::escape( $string ) . '"'; 
   }
   public static function escape_gpc( $string , $quote = false )
   {
      return self::escape( self::un_gpc( $string ), $quote); 
   }
   public static function get( $string , $quote = true )
   { 
      return self::escape_gpc( $_GET[$string] , $quote ); 
   }

}

# Handy Dandy.
$q = 'SELECT * FROM FOO WHERE BAR = ' . DB::get( 'bar' ) ; 

答案 6 :(得分:0)

我认为你想要的东西就像一个C宏,它很容易像函数一样使用,但没有调用真实函数那样的开销。 PHP没有任何此类功能。您是否正在尝试使代码更快或更高效?

答案 7 :(得分:-1)

“轻松”,当然? “优雅地”,nope。