Можно ли легко "символическую ссылку" на функцию в PHP или псевдоним имени к чему-то еще? - PullRequest
3 голосов
/ 26 ноября 2008

Например, я ненавижу печатать такие вещи, как:

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

Есть ли способ псевдонима этих двух функций в init.php или чего-то другого без написания отдельной функции, которая принимает один аргумент и возвращает этот аргумент с примененными к нему функциями?

Мой C / C ++ не очень хорош, но я думаю, что это похоже на #typedef, но для функций?

Ответы [ 8 ]

8 голосов
/ 26 ноября 2008

Я надеюсь, что ваш пример не является представителем вашего проекта.

  1. stripslashes() не должно быть необходимо - если вы обнаружите, отключите magic_quotes_gpc в вашем php.ini.
  2. Вы должны использовать mysql_real_escape_string() (или пару prepare / execute) вместо mysql_escape_string(), и это должно быть там, где собирается ваш SQL, а не там, где вы получаете значения из URL.

Исправьте эти две проблемы, и ваш код выродится в

$x = $_GET['x'];
4 голосов
/ 26 ноября 2008
function myget($string)
{
  return mysql_real_escape_string(stripslashes($_GET[$string]));
}

Это решение в PHP.

2 голосов
/ 26 ноября 2008

Я бы согласился с предложением Билла Карвина, но я хотел бы добавить точку зрения, которую я считаю важной.

Если вы хотите заменить повторяющиеся вызовы a (b (...)) на c (...), есть вероятность, что c имеет какое-то значение само по себе - помимо простой композиции. Подумайте о контексте и о том, как бы вы назвали такую ​​функцию. Часто у него будет своя собственная семантика, которая конкретно не зависит от a, b - это всего лишь одна реализация. Если это так, то легко увидеть это как (простую) функцию, которая сама по себе реализуется вызовом b, затем a. Простота в этом случае может соблазнить вас на «псевдоним» функции, но в общем случае это, вероятно, не слишком полезно.

Теперь в этом конкретном случае я бы подумал:

  • Какое разумное название для этой составной функции?
  • Почему нет никого, кто бы это уже сделал?
  • Почему я не использую параметры запроса?

Серьезно. Именно по этой причине вам следует использовать параметры запроса, чтобы снизить риск атак с использованием SQL-инъекций. НАМНОГО более надежно, чем то, что вы пытаетесь сделать здесь.

2 голосов
/ 26 ноября 2008

Это должно сработать:

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

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

Хотя я не рекомендую вообще так кодировать.

Я просто отвечаю на вопрос, поскольку вы сказали, что не хотите создавать какие-либо новые функции и получать функциональность, подобную "#define".

1 голос
/ 26 ноября 2008

Вы можете сделать анонимную функцию с помощью create_function :

$newFunc = create_function('', 'return mysql_escape_string(stripslashes($_GET[\'x\']));');
$newFunc();
0 голосов
/ 26 ноября 2008

Я предполагаю, что вы хотите что-то вроде макроса C, который прост в использовании как функция, но не имеет таких издержек, как вызов реальной функции. У PHP нет такой возможности. Вы пытаетесь сделать свой код быстрее или эффективнее?

0 голосов
/ 26 ноября 2008

Если вам нужно отображение функции 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' ) ; 
0 голосов
/ 26 ноября 2008

"легко", конечно? "элегантно", нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...