小编Dem*_*a ツ的帖子

动态引用$ this应该不起作用,但确实如此

根据有关变量变量的 PHP文档:

$ this是一个无法动态引用的特殊变量

然而,它似乎是假的,至少在PHP版本上,我已经测试过(5.5.12).

class ThisIsBugged
{
    public function __construct()
    {
        ${'this'}->doSomething(); // This works, while it shouldn't
    }
}
Run Code Online (Sandbox Code Playgroud)

问题1:它如何运作?根据文件,它不应该.

但还有更多.

class ThisIsBugged
{
    public function __construct()
    {
        // This does not work, but it could. See below.
        ${'th' . 'is'}->doSomething();
    }
}
Run Code Online (Sandbox Code Playgroud)

它按预期停止执行:

PHP注意:未定义的变量:这个

PHP致命错误:在非对象上调用成员函数doSomething().

请注意,该语句{'th' . 'is'}已经过评估:"未定义的变量:this".

但是(这是最奇怪的事情),明确引用特殊变量$this,修复在方法之前或之后使用的所有动态引用.

class ThisIsBugged
{
    public function __construct()
    {
        // Now it works while it shouldn't
        ${'th' . 'is'}->doSomething();

        // This fixes …
Run Code Online (Sandbox Code Playgroud)

php

54
推荐指数
1
解决办法
3814
查看次数

使用类属性作为函数名称调用变量函数

下面的代码使用存储在属性$ prop中的字符串"rand"来调用rand()作为变量函数,使用$ function作为临时局部变量.

class C
{
    private $prop = "rand";

    public function execute()
    {
        $function = $this->prop;
        echo $function();
    }
}

$c = new C();
$c->execute();
Run Code Online (Sandbox Code Playgroud)

这是有效的,但我需要使用一个语句并避免使用临时变量来调用存储在$ this-> prop中的变量函数.

我没有运气

echo $this->prop();
Run Code Online (Sandbox Code Playgroud)

因为它实际上调用了不存在的方法prop(),并且在任何情况下它都不是我想要做的.

由于$ this-> prop实际上是一个字符串,我尝试了以下内容,但它产生了语法错误:

echo ($this->prop)();
Run Code Online (Sandbox Code Playgroud)

我也试过了

echo call_user_func($this->prop);
Run Code Online (Sandbox Code Playgroud)

虽然它可以完成工作,但它不是我的选择,因为它不是一个可变函数.

看起来变量函数只能使用局部变量作为函数名.

有没有人知道使用类属性作为函数名直接调用变量函数的方法,避免使用本地临时变量和call_user_func()的用法?

编辑: 我理解你的困惑,因此我将解释使用call_user_func时出了什么问题.

我只是在探索变量函数提供的机会,这似乎比变量变量提供的机会少.

让我们尝试使用变量变量将其最简单的形式.

假设我们有一个函数f(),它返回字符串"something"

function f() {
  return "something";
}
Run Code Online (Sandbox Code Playgroud)

然后是包含字符串"something"的类属性

$this->prop = "something";
Run Code Online (Sandbox Code Playgroud)

$ something是一个局部变量

$something = "I am a local variable";
Run Code Online (Sandbox Code Playgroud)

然后以下所有语句都将起作用:

$r = ${"something"};
$r = ${$this->prop};
$r = ${f()};
Run Code Online (Sandbox Code Playgroud)

我的个人结论:无论字符串"东西"如何获得; 用大括号{}围绕它,并在前面添加美元符号$,将其视为变量.相当flessibe. …

php

6
推荐指数
1
解决办法
2051
查看次数

PHP 函数 parse_ini_file() 真的那么危险吗?

一些托管服务提供商禁用了 PHP 函数 parse_ini_file()。
任何在那里使用它的尝试都会失败,并显示错误“出于安全原因,parse_ini_file() 已被禁用”。
这种配置非常普遍,以至于作为最流行的 CMS 之一的 Joomla 避免了直接使用 parse_ini_file() ,而是将任务分为两步:

  1. 使用 file_get_contents() 读取文件内容
  2. 使用 parse_ini_string() 解析值,奇怪的是,这是允许的,因此它不被视为安全风险(WTF?)

我的问题是,如何使用 parse_ini_file()会被视为安全威胁,或者如何禁用 PHP 函数 parse_ini_file() 可以提高安全性?

会不会是个骗局?
我的意思是,也许在过去的某个地方,有人将 parse_ini_file() 与 ini_set() 混淆,并认为 parse_ini_file() 可以更改 PHP 环境的配置。
博主可以在这里和那里提供建议,而天真的系统管理员可以不问自己任何问题就遵循这些建议。

php security joomla

6
推荐指数
1
解决办法
1676
查看次数

PHP basename()和pathinfo()具有多字节UTF-8文件名

我发现PHP函数basename()以及pathinfo()对于多字节utf-8名称都具有奇怪的行为。它们会删除所有非拉丁字符,直到第一个拉丁字符或标点符号为止。但是,此后,将保留后续的非拉丁字符。

basename("àxà"); // returns "xà", I would expect "àxà" or just "x" instead
pathinfo("àyà/àxà", PATHINFO_BASENAME); // returns "xà", same as above
Run Code Online (Sandbox Code Playgroud)

但奇怪的是pathinfo()的目录名部分工作正常:

pathinfo("àyà/àxà", PATHINFO_DIRNAME); // returns "àyà"
Run Code Online (Sandbox Code Playgroud)

PHP文档警告basename()pathinfo()函数知道区域设置,但这并不能说明pathinfo(..., PATHINFO_BASENAME)和之间的不一致pathinfo(..., PATHINFO_DIRNAME),更不用说根据它们相对于拉丁语的位置,相同的非拉丁语字符将被丢弃还是被接受的事实。字符。

听起来像是一个PHP错误。

由于“基本名称”检查对于避免直接遍历对安全性而言非常重要,因此是否有任何可靠的基本名称过滤器可以很好地与Unicode输入配合使用?

php unicode utf-8 pathinfo

6
推荐指数
1
解决办法
1451
查看次数

使用Swift Mailer将html和css邮件发送到gmail

我有一些基本的HTML和一些CSS但由于某种原因gmail把3D infornt'text/css'

代码示例

$message = "
            <style type='text/css'>
              #main {border:1px solid red;}
            </style>

              <div id='main'>some text</div>
";
Run Code Online (Sandbox Code Playgroud)

但是当我查看原始发送到gmail时

<style type=3D'text/css'>
Run Code Online (Sandbox Code Playgroud)

也许这就是为什么邮件没有样式.我正在使用swift邮件程序

//也是在html中

<div id=3D'main'>
Run Code Online (Sandbox Code Playgroud)

//快速邮件

    $type = $message->getHeaders()->get('Content-Type');
    $type->setValue('text/html');
    $type->setParameter('charset', 'utf-8');
Run Code Online (Sandbox Code Playgroud)

html css email gmail swiftmailer

5
推荐指数
1
解决办法
3770
查看次数

PHP json有时会将浮点数转换为整数

给定一个浮点数,在json编码和后续解码之后,变量类型float(或double)有时它不会被保留.

$n1 = 1.23;
$json = json_encode($n1); // '1.23'
$n2 = json_decode($json);

$t1 = gettype($n1); // 'double'
$t2 = gettype($n2); // 'double'

$d = $n1 === $n2; // true
Run Code Online (Sandbox Code Playgroud)

但是,当小数为"0"时,结果会有所不同:

$n1 = 1.0;
$json = json_encode($n1); // '1'
$n2 = json_decode($json);

$t1 = gettype($n1); // 'double'
$t2 = gettype($n2); // 'integer'

$d = $n1 === $n2; // false
Run Code Online (Sandbox Code Playgroud)

我必须得出结论,json编码/解码函数的行为是基于数据值的,因此难以预测,并且最终非常不一致.

有没有办法确保在json编码/解码过程中保留变量的类型?

php json

4
推荐指数
1
解决办法
1147
查看次数

标签 统计

php ×5

css ×1

email ×1

gmail ×1

html ×1

joomla ×1

json ×1

pathinfo ×1

security ×1

swiftmailer ×1

unicode ×1

utf-8 ×1