我们可以限制 PHP 变量只接受某种类型的值吗

2023-11-26

我想知道是否可以限制 php 变量仅接受它定义为接受的某种类型的变量。

e-g 如果我们在 C# 中看到

public int variable = 20;
public string variable2 = "Hello World";

那么如果我想限制变量的类型,在 php 中会是什么样子。

public int $variable = 20;

因此,如果我尝试将字符串分配给整数变量,我会收到错误。

public int $varaible = "Hello World"; //As type is integer, it should throw error.

在给变量赋值之前,有没有在 PHP 中定义变量类型的东西?


TL;DR不直接,不。 PHP 不是严格类型的。但是,有一些解决方法可能适合您在函数参数或类属性的上下文中。

长答案:PHP 不是严格类型语言,而是松散类型语言。您可以为变量指定任何您想要的值,无论它是如何初始化的。所以,你不能简单地输入类似的内容int $myVar并期望$myVar = "foo";抛出错误。但是 PHP 确实提供了一些方便的功能,可以让您在处理函数参数或类的属性时达到相同的目的。

选项 1:键入提示

您可以使用“输入提示”对于函数参数:

class SomeClass 
{
    /* code here */
}

function foo(SomeClass $data)
{
    /* code here */
}

foo()只接受类型的参数SomeClass。通过它,比方说,int会抛出致命错误。如果参数是基本类型,则这在 PHP int, string等等,所以你不能这样做function foo(int $data) {...}。也就是说,有一些库试图以牺牲一点速度为代价来强制它工作。另外,PHP 7 增加了很多对这种东西的支持,基于 PHP 的 Hack 语言也是如此。

Pros:

  • Easy
  • 直觉的

Cons:

  • 仅适用于程序定义的类
  • 不适用于基本类型

选项 2:Getter 和 Setter

您还可以使用 getter 和 setter,如下所示:

class SomeClass 
{
    private $foo = 0;

    function setFoo($val = 0)
    {
        // force it to be an int
        if (is_integer($val) {
            $this->foo = $val;
        } else {
            // throw an error, raise an exception, or otherwise respond
        }
    }
}

Pros:

  • 比较容易
  • 比较直观

Cons:

  • 仅适用于程序定义的类
  • 不适用于基本类型
  • 需要大量代码

选项 3:魔法方法

这个方法是我最喜欢的,但也是最复杂的。使用__set()魔术方法处理类属性。

class MyClass {
    private $type = 0; // we will force this to be an int
    private $string = ''; // we will force this to be a string
    private $arr = array(); // we will force this to be an array
    private $percent = 0; // we will force this to be a float in the range 0..100
    
    function __set($name, $value) {
        switch ($name) {
            case "type":
                $valid = is_integer($value);
                break;
            case "string":
                $valid = is_string($value);
                break;
            case "arr":
                $valid = is_array($value);
                break;
            case "percent":
                $valid = is_float($value) && $value >= 0 && $value <= 100;
                break;
            default:
                $valid = true; // allow all other attempts to set values (or make this false to deny them)
        }
        
        if ($valid) {
            $this->{$name} = $value;

            // just for demonstration
            echo "pass: Set \$this->$name = ";
            var_dump($value);
        } else {
            // throw an error, raise an exception, or otherwise respond

            // just for demonstration
            echo "FAIL: Cannot set \$this->$name = ";
            var_dump($value);
        }
    }
}

$myObject = new MyClass();
$myObject->type = 1; // okay
$myObject->type = "123"; // fail
$myObject->string = 1; // fail
$myObject->string = "123"; // okay
$myObject->arr = 1; // fail
$myObject->arr = "123"; // fail
$myObject->arr = array("123"); // okay
$myObject->percent = 25.6; // okay
$myObject->percent = "123"; // fail
$myObject->percent = array("123"); // fail
$myObject->percent = 123456; // fail

Pros:

  • 比较容易
  • 直觉的
  • 极其强大:一位二传手统治一切

Cons:

  • 仅适用于程序定义的类
  • 不适用于基本类型
  • 需要大量的switching or if/else logic
  • 可能会导致 IDE 无法正确自动完成属性类型的问题

这是一个这种方法的演示.

结束语

最后,如果您使用 PHPStorm 这样的 IDE,请不要忘记 PHPDoc 类型提示:

/* @var integer */
$foo = 0; // will result in warnings if the IDE is configured properly and you try to do something like substr($foo, 1, 4);

如果你really想要成为硬核,你可以使用强类型Hack,代价是使您的代码的可移植性较差并且与主要 IDE 的兼容性(目前)较差。

当然,这些都不能替代显式验证用户输入并彻底测试应用程序对意外输入类型的响应。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我们可以限制 PHP 变量只接受某种类型的值吗 的相关文章

  • 我的 zend 应用程序无法在 YouTube 上上传文件

    我正在使用以下代码在 YouTube 上上传小型和大型视频 该代码在本地主机上正常工作 但是当我在服务器上运行它并上传相同的视频时 它会上传所有小文件 但不会上传大文件 上传完成后 YouTube 对于大尺寸文件显示以下错误 失败 无法转换
  • IOS 向特定用户推送通知?

    是否可以向特定设备发送 iOS 推送通知 我构建了一个论坛类型的应用程序 用户可以创建问题 其他人可以回答它 我需要向提出问题的特定用户发送 iOS 推送通知 通知他们问题已得到解答 这可以通过 PHP 或其他方法来完成吗 是的 您绝对可以
  • 销毁Session但保留flashdata

    我在用坦克验证 http www konyukhov com soft tank auth 用于我的 CI 1 7 3 应用程序中的用户管理 一切工作正常 但我正在尝试设置flash message当用户注销时显示 问题是 this gt
  • Apache 在多个虚拟主机上运行 Zend Framework 时出现间歇性 500 错误

    我们已经在一个项目上工作了几个月 没有出现任何问题 直到最近进行了一系列更新 服务器运行 Amazon Linux AMI 版本 2010 11 1 Apache 2 2 16 和 PHP 5 3 3 该项目分为几个独立的开发人员分支 作为
  • WordPress、PHP、URL 编码问题

    Wordpress 提供了一个名为 the permalink 的函数 您猜对了 在帖子循环中返回给定帖子的永久链接 我正在尝试对该永久链接进行 URL 编码 当我执行此代码时 它以 HTML 形式生成以下结果 http
  • 根据送货方式 ID 在 WooCommerce 新订单电子邮件通知中隐藏送货地址

    如果送货标签名为 在洛克菲勒商店提货 我想隐藏送货地址 但要显示其他提货方法 有太多的 id 例如 local pickup 3 我无法过滤 我启用了显示送货地址的功能电子邮件 电子邮件地址 php https github com woo
  • 致命错误:在非对象上调用成员函数 FetchRow()

    这是我的错误消息致命错误 Call to a member function FetchRow on a non object in C AppServ www hfix include care api classes class min
  • PHP 中的延迟加载类方法

    我有一堂课 里面有一些相当大的方法 在它的基本和最常见的状态下 大多数功能并不是必需的 所以我想知道是否有一种方法可以延迟加载类的一部分 这些方法需要能够访问私有 受保护的成员 因此如果这些方法是类的本机方法 那将是理想的选择 但是在寻找其
  • 将我的 JSON 字符串格式化为 PHP 中的
      有序列表

    我正在为一个宠物项目开发一个简单的 CMS 我目前有一个 JSON 字符串 其中包含菜单结构的页面 ID 和父页面 ID 的列表 我现在想将此字符串转换为嵌套或分层列表 有序列表 我尝试过循环查找 但似乎最终得到了过于复杂的子类范围 我正在
  • 在 foreach 循环中使用 next

    我正在使用 foreach 循环数组 在特定情况下 我需要在迭代到达下一个元素 如预测 之前知道下一个元素的值 为此 我计划使用该功能next http www php net manual en function next php 在文档
  • 在 PHP 中使用重命名函数时出错

    尽管文件仍然被移动到正确的目录中 但我不断收到此错误 有人知道我为什么会收到此错误吗 Warning rename Images uploaded 1162504 56863010 jpg Images uploaded Portraits
  • Outlook 2007 接收 html 邮件作为带有标头的源,其他 MUA 工作正常。为什么?

    我有几个简单的表单 可以发送纯 html 电子邮件 大多数客户端 Gmail Lotus Notes 8 hotmail live windows live mail outlookexpress 都能正常接收电子邮件 但 Outlook
  • 在 Woocommerce 结帐页面上移动亚马逊按钮

    我需要移动 Woocommerce 结账页面上的 Amazon Pay 消息 按钮 我们正在使用Woocommerce 的亚马逊支付 https woocommerce com products pay with amazon 当我查看插件
  • 在 PHP 中,如何检查函数是否存在?

    如何检查该功能是否可用my functionPHP 中已经存在 Using function exists http php net function exists if function exists my function my fun
  • Laravel 5 中的两个登录表单

    我一直想知道如何在 laravel 5 中制作两个登录表单一段时间 原因是因为我有一个多站点项目 我在一个项目中拥有管理站点和公共站点 我对路由进行了分组 以便管理路由回答一个域 公共路由回答另一个域 如下所示 Route group ar
  • 在 Woocommerce 中设置购物车商品价格后重新计算总计

    通过 set price 方法更改产品价格后 如何更改小计价格 现在在review order php中按旧价格计算总成本 cart php foreach WC gt cart gt get cart as cart item key g
  • 上传并 POST 文件到 PHP 页面

    我需要一种上传文件并将其 POST 到 php 页面的方法 php 位于 apache 服务器上 我在我的桌面应用程序中使用这个 C 代码 这是一个c代码的套接字 当我执行程序时 可以得到 文件大小为772906 打开服务器正常 文件大小为
  • PHP - 简单嵌套无序列表 (UL) 数组

    我在 stackoverflow 上看到了这个嵌套 UL 数组问题的一些变体 但我认为我的比其他问题更简单 我正在寻找一个简单的数组循环 它允许无限量的主题 父项 和无限量的项目 子项 例如 ul li Topic li ul li Ite
  • WooCommerce 从所有订单中获取项目元

    我正在尝试显示 WooCommerce 插件中所有已完成订单的所有订单项目 带有项目元 我还想将显示限制为仅显示 10 个订单项目 我已经弄清楚如何显示所有订单项目 但无法将数量限制为 10 这是我当前用于显示所有订单项目的代码 args
  • 如何使用 OOP 从另一个 .php 到另一个 .php 的类使用 $db?

    我是 OOP PHP 的新手 自从开始 Web 开发以来我一直在使用过程 API 所以我很难迁移到 OOP 假设我有这四个 php文件和结构如下 连接 db php

随机推荐