「PHP系列」PHP7 新特性:常量数组、匿名类、Closure::call()

一、常量数组

在 PHP 中,你不能直接将一个数组定义为常量,因为常量是值(scalar values),如字符串、整数或浮点数,而不是变量或数组等复合数据结构。然而,你可以通过一些方法模拟常量数组的行为。

一种常见的方法是使用一个类来保存这些“常量”数组,并使用静态属性来访问它们。例如:

class Constants {
    public static $myArray = [
        'key1' => 'value1',
        'key2' => 'value2',
        // ...
    ];
}

// 使用方法
$value = Constants::$myArray['key1'];

虽然这种方法使用的是静态属性而不是常量,但它提供了类似常量的行为,并且你可以通过类名直接访问它。

另一种方法是使用配置数组或文件,并在需要时从那里检索值。这通常用于配置文件,如数据库凭据、URL 等。

// config.php
return [
    'database' => [
        'host' => 'localhost',
        'username' => 'root',
        'password' => 'password',
        'dbname' => 'mydatabase',
    ],
    // ... 其他配置
];

// 在其他文件中使用
$config = include 'config.php';
$host = $config['database']['host'];

最后,如果你只是想在代码中定义一个数组并在多个地方使用它,但不想让它成为全局变量或类属性,你可以考虑使用函数来返回这个数组。然而,请注意,这仍然不是真正的“常量”数组,因为你可以更改函数内部的实现以返回不同的数组。

function getMyArray() {
    return [
        'key1' => 'value1',
        'key2' => 'value2',
        // ...
    ];
}

// 使用方法
$array = getMyArray();
$value = $array['key1'];

二、匿名类

在 PHP 7 及以后的版本中,PHP 引入了匿名类(Anonymous Classes)的功能。匿名类是一种在运行时创建的不需要名称的类定义。它们主要用于一次性的、临时的、或者在不需要给类指定一个明确名称的场景下。

匿名类在以下情况下可能很有用:

  1. 当你需要快速创建一个简单的类,并且不需要在其他地方引用它时。
  2. 当你需要在某个地方(如回调、闭包或工厂方法)中定义一个类,并且不想为它创建一个命名的类定义时。

以下是使用匿名类的一个例子:

$instance = new class {
    private $value;

    public function __construct($value) {
        $this->value = $value;
    }

    public function getValue() {
        return $this->value;
    }
};

echo $instance->getValue(); // 如果构造函数中传入了一个值,这里就会输出那个值

在这个例子中,我们创建了一个匿名类,该类有一个私有属性 $value 和一个公共的构造函数来设置这个属性的值。我们还定义了一个公共方法来获取这个属性的值。然后,我们实例化了这个匿名类,并通过其 getValue() 方法输出了属性的值。

匿名类只能在其被定义的上下文中使用。一旦离开了定义它们的代码块,匿名类就不能再被引用或访问了。

虽然匿名类没有显式的名称,但它们在内部仍然有一个唯一的名称,这个名称在运行时由 PHP 自动生成,并且是不可访问的。因此,你不能使用像 instanceof 这样的操作符来检查一个对象是否是一个特定的匿名类的实例,除非你保存了对该匿名类实例的引用,并且可以在同一个代码块中进行比较。

三、Closure::call()

在 PHP 中,Closure::call() 是一个静态方法,它允许你调用一个闭包(Closure)对象,并指定闭包内的 $this 上下文(对象实例)和调用时的参数。这在你需要改变闭包中 $this 的上下文时非常有用,特别是当闭包是作为回调函数或事件处理器使用时。

Closure::call() 方法接收两个必需参数:

  1. ** o b j e c t ∗ ∗ (或 ‘ n u l l ‘ ) − 这个参数是你想要绑定到闭包 ‘ object**(或`null`) - 这个参数是你想要绑定到闭包 ` object(或null这个参数是你想要绑定到闭包this的对象实例。如果你传递null,那么闭包将在一个没有 $this` 的上下文中执行(即全局范围)。
  2. $closure - 要调用的闭包对象。

接下来是可选的参数列表,这些参数将传递给闭包作为调用时的参数。

下面是一个简单的例子:

class MyClass {
    public $value = 'Default';

    public function getClosure() {
        return function() {
            echo $this->value . "\n";
        };
    }

    public function callClosureWithThis($otherObject) {
        $closure = $this->getClosure();
        $otherObject->value = 'Modified by OtherObject';
        Closure::call($otherObject, $closure); // 绑定 $this 到 $otherObject
    }
}

$obj1 = new MyClass();
$obj2 = new stdClass(); // 使用 stdClass 作为示例,因为它没有 $value 属性

$obj1->callClosureWithThis($obj2); // 输出 "Modified by OtherObject"

然而,这个例子不会按预期工作,因为闭包是在 $obj1 的上下文中创建的,它试图访问 $this->value,但是当我们使用 Closure::call() 并传递 $obj2 作为 $this 上下文时,闭包内部仍然引用的是 $obj1$this。为了解决这个问题,我们需要使用 Closure::bind() 或在闭包定义时使用 use 关键字来捕获 $this 的正确引用。

但是,如果你想要模拟闭包内部 $this 的改变,你可以这样做:

class MyClass {
    public $value = 'Default';

    public function getClosure() {
        return function() use ($this) {
            echo $this->value . "\n";
        };
    }

    // ... 其他方法 ...
}

// 使用闭包并捕获 $this 的正确引用
$closure = (new MyClass())->getClosure();
$closure(); // 输出 "Default"

在上面的例子中,我们通过闭包的 use 关键字捕获了 $this 的正确引用,这样闭包就会访问创建它的那个对象的 $value 属性。

四、相关链接

  1. php官网
  2. php_Github
  3. PHP实现Token
  4. 「PHP系列」PHP简介与起步
  5. 「PHP系列」PHP语法介绍
  6. 「PHP系列」PHP变量
  7. 「PHP系列」PHP echo/print语句、数据类型详解
  8. 「PHP系列」PHP 常量/字符串、类型比较
  9. 「PHP系列」PHP 运算符详解
  10. 「PHP系列」If…Else语句/switch语句
  11. 「PHP系列」数组详解
  12. 「PHP系列」PHP数组排序及运用场景
  • 24
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
loop_closure::projectedimage是指在闭环检测中,根据当前帧和候选关键帧之间的视觉特征关联,生成的一个投影图像。在闭环检测过程中,首先通过一系列的特征提取和描述子匹配,将当前帧与所有候选关键帧进行匹配。然后根据这些匹配点对,通过相机位姿估计,将候选关键帧中的3D点投影到当前帧上,生成一个投影图像。 投影图像的生成过程主要有以下几个步骤。首先,通过计算相机位姿,将候选关键帧上的3D点变换到当前帧的坐标系下。然后,根据相机内参和当前帧的图像尺寸,将3D点的投影坐标计算出来。接着,根据投影坐标,在当前帧上绘制对应点的像素值,形成投影图像。 生成的投影图像可以用于闭环检测算法中的误差计算和匹配特征点的筛选。通过比较投影图像与当前帧原始图像中的像素差异,可以评估当前帧与候选关键帧之间的相似性。如果投影图像与当前帧的像素差异较小,则说明当前帧与候选关键帧之间可能存在闭环。在闭环检测中,通过匹配特征点并计算它们的误差,可以进一步筛选出匹配质量较高的闭环候选。最终,根据这些闭环候选,可以在SLAM系统中进行闭环的优化和修正,提高系统的鲁棒性和精度。 总之,loop_closure::projectedimage是通过相机位姿估计,将候选关键帧中的3D点投影到当前帧上,生成的一个投影图像。这个投影图像可以用于闭环检测的特征匹配和误差计算,进一步优化和修正SLAM系统中的闭环。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪梅零落

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值