【问题标题】:How do I know if the parameter passed to a function is a variable or a string?如何知道传递给函数的参数是变量还是字符串?
【发布时间】:2013-09-03 15:36:09
【问题描述】:

我有一个名为 myFoo 的函数,它对传递给它的字符串执行一些操作(在这种情况下,为简单起见,它只是将其打印出来)。

我希望这个函数以这种方式运行:

  • 当使用变量调用时,如在myFoo($myBar); 中,我希望它在将变量打印出来之前对其进行清理。

  • 当使用字符串调用时,如myFoo("My name is Bar");,我希望它跳过字符串清理位。

函数myFoo如下图:

public function myFoo($bar) {
    // Determine if $bar was a string, or a variable
    if([$bar was passed as a variable]) {
        // Sanitize it
        $bar = filter_var($bar,FILTER_SANITIZE_STRING);
    }
    // Otherwise, just print it out without sanitization

    // Print it
    echo $bar;
}

我应该在if 语句中写什么来确定参数是直接字符串还是字符串变量?这甚至可能吗?谢谢!

更新 - 进一步说明

我可能应该早点澄清我的意图......这里是: 所以我实际上打算使用它来翻译我的 PHP 网站上的所有文本(跨所有页面)。所以,不要写这样的东西:

<html>
<head><title>Welcome to the ACME Co. Homepage</title></head>
<body><h1>Welcome to the ACME Co. Homepage</h1>
...

.. 我会改为这样写:

<html>
<head><title><?= _("Welcome to the ACME Co. Homepage"); ?></title></head>
<body><h1><?= _("Welcome to the ACME Co. Homepage"); ?></h1>
...

_ 方法将确定语言设置,并以正确的语言输出字符串。我想我只是想跳过清理页面上每一件事的开销,而不是仅仅清理用户输入(尤其是,因为这个函数被频繁地调用非常

【问题讨论】:

  • 消毒是什么意思?
  • 据我所知这是不可能的。例如,尝试将 var_dumping $bar 作为直接字符串和 var 参数,它是 100% 相同的。您最多可以测试函数内部的变量类型(isInt、isDouble 等)
  • @FaceOfJock 在以 HTML 形式显示(或存储到数据库)之前清理输入。这是more
  • @RUJordan 是的,我也试过var_export,但它没有区分这两个实例:(

标签: php string parameter-passing


【解决方案1】:

你无法分辨。当调用带有变量参数的函数时,函数接收变量的值作为参数。所以在这两种情况下,函数只看到一个字符串。

您可以添加第二个参数,说明是否应清理该值:

public function myFoo($bar, $sanitize = true) {
    if ($sanitize) {
        $bar = filter_var($bar, FILTER_SANITIZE_STRING);
    }
    echo $bar;
}

那你就可以调用它了:

myFoo("My name is Bar", false);

【讨论】:

  • 我想知道是否会出现在字符串上运行filter_var() 会很糟糕的情况?如果没有,他总是可以在函数中执行if( is_string( $bar ) { $bar = filter_var( $bar, FILTER_SANITIZE_STRING ); } 并跳过第二个参数。
  • 如果字符串包含特殊字符并且您想保留它们,运行 sanitive 将删除它们。
  • 如果你想保留它们,为什么还要运行该方法?
  • 如果您通常将其与文字字符串一起使用,请将默认值更改为 false。然后在使用变量的时候,写_($var, true)
  • 是的,有道理。 Magento 做了很多工作,尽管它专门用于定义元素内的文本,并且不使用任何标签。
猜你喜欢
  • 2016-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-02
相关资源
最近更新 更多