链接方法时如何返回 false

2024-01-06

我有一个使用方法链的验证类。我希望能够进行单次检查TRUE/FALSE像这样:

if ($obj->checkSomething()) {}

但也有像这样的链方法:

if ($obj->checkSomething()->checkSomethingElse()) {}

然而问题是,如果一种方法返回FALSE,它不会发回对象,从而破坏方法链,并以此错误结束:

Fatal error: Call to a member function checkSomething() on a non-object in ...

我是否必须选择单一方法返回调用或方法链接,或者是否有解决方法?


一种想法是设置一个内部标志来指示成功或失败,并通过另一种方法访问它,同时检查每个方法中的该标志,如果设置了该标志,则不执行任何操作。例如。:

class A {
    private $valid = true;

    public function check1() {
        if (!$this->valid) {
            return $this;
        }
        if (!/* do actual checking here */) {
            $this->valid = false;
        }
        return $this;
    }
    public function check2() {
        if (!$this->valid) {
            return $this;
        }
        if (!/* do actual checking here */) {
            $this->valid = false;
        }
        return $this;
    }
    public function isValid() {
        return $this->valid;
    }
}

// usage:

$a = new A();

if (!$a->check1()->check2()->isValid()) {
    echo "error";
}

为了最大限度地减少每个函数中的样板检查,您还可以使用魔术方法__call(). E.g.:

class A {
    private $valid;
    public function __call($name, $args) {
        if ($this->valid) {
            $this->valid = call_user_func_array("do" . $name, $args);
        }
        return $this;
    }
    private function docheck1() {
        return /* do actual checking here, return true or false */;
    }
    private function docheck2() {
        return /* do actual checking here, return true or false */;
    }
    public isValid() {
        return $this->valid;
    }    
}

用法与上面相同:

$a = new A();

if (!$a->check1()->check2()->isValid()) {
    echo "error";
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

链接方法时如何返回 false 的相关文章

随机推荐

  • 获取 Android 上的所有总空间和可用空间

    据我所知 Android 上有 应用程序和缓存的内部存储器 某些手机 上的内置 SD 卡 不可拆卸 用于存储音乐和照片的外部 SD 卡 可拆卸 如何通过检查它们是否存在来获取每个手机的总数和可用数量 某些手机没有内部 SD 卡 Thanks
  • iOS - 链接器错误、重复符号

    似乎我在尝试编译时遇到错误 它似乎直接指向两个文件 MenuViewController 和 FirstTopViewController 我认为这与我的导入有关 因为它们每个都在导入另一个 但是错误引用了我的 Building 对象 该对
  • 打瞌睡模式和应用程序待机

    我如何在我的应用程序中知道手机是否处于打瞌睡模式或我的应用程序是否处于待机模式 我也可以通过某种订阅方式知道吗 有一个区别应用程序待机 您的应用程序转到的位置 睡觉是因为很孤独 和Doze 系统去哪里 睡觉 因为用户有生命 Doze仅当您的
  • 使用 Dapper 映射 SqlGeography

    我有实体 Point 其中包含 ID 文本和地理坐标 CREATE TABLE Point Id INT IDENTITY CONSTRAINT PK Point Id PRIMARY KEY Coords GEOGRAPHY NOT NU
  • android ConstraintLayout 不允许负边距

    我相对于布局指南放置了很多项目 并希望将新项目放置在几乎与此布局指南相关的位置 我尝试使用负布局边距但没有成功 android translationX 10dp android translationY 10dp
  • Laravel:使用 AJAX 请求渲染部分视图

    我正在尝试制作一个单页 CRUD 应用程序 并且将 AJAX 与 jQuery 结合使用 在本例中 我提交表单并在数据库中异步存储一个新国家 地区 然后使用新数据渲染部分视图 这是我的脚本和从数据库检索国家 地区并返回部分视图的方法 cre
  • 写入错误:使用 O_DIRECT 打开文件时参数无效

    对我来说 用以下内容写入文件非常重要O DIRECT flag 这就是我打开文件的方式 Open the file int fd if fd open inFilepath O WRONLY O CREAT O SYNC O DIRECT
  • 在表达式中的 let .. 中使用守卫

    有时我会写这样的代码 solveLogic Int gt Int gt Int solveLogic a b let x 1 brainiac a gt x 1 a b 333 otherwise 5 in brainiac 每次我都想写这
  • IPython Notebook 之前的单元格内容

    是否可以在 IPython Notebook 单元格中获取上一个 上方 单元格内容 我可以使用 capture 魔术函数查看以前的输出 但我不知道如何获取以前的单元格内容 recall jupyter notebook cell numbe
  • 普通 Javascript 对象上的 jQuery.bind() 事件

    是否可以将 jQuery 事件绑定到普通的非 DOM Javascript 对象 var myobject myobject bind foobar function alert daa myobject trigger foobar 有何
  • 如何让下面的代码更快

    int u1 u2 unsigned long elm1 20 mulpre 16 20 res1 40 res2 40 64 bits long res1 res2 initialized to zero l 60 while l for
  • PHP Array_intersect 在具有未知数量键的多维数组上

    我正在尝试在拥有资源 人员 的应用程序中制作高级搜索过滤器 我在 1 个多维数组中得到了所有结果 该应用程序的用户可以搜索人员的职位名称 技能 工作领域和国家 地区 我已经完成了查找符合用户给出的标准的人的部分 这些结果存储在多维数组中 如
  • Android ACTION_GET_CONTENT 不更新下载目录文件

    我在选择文件时遇到问题下载目录使用ACTION 获取 内容 如果我删除本地存储中的 ES 资源管理器或文件管理器中的任何文件 这些删除的文件不会在下载在我的应用程序中打开时的目录 任何变化下载dir 没有反映在选择器中 要选择一个文件 我正
  • Angular 通用 html lang 标签

    在 Angular Universal 中 我有一个 index html 文件 顶部有 我想根据我所在的页面更改此设置 maldonadoattorney com es jailreleases 将是 maldonadoattorney
  • Django - 使用模板标签和“with”?

    我有一个自定义模板标签 def uploads for user user uploads Uploads objects filter uploaded by user problem upload False num uploads u
  • 基于支持向量的数据重采样器

    我正在努力实现一个数据重采样器以基于support vectors 这个想法是为了适应SVM分类器 得到support vector类的点 然后通过仅选择每个类的支持向量点附近的数据点来平衡数据 以使类具有相同数量的示例 忽略所有其他 远离
  • Google Plus API 错误gapi.loaded_0

    我尝试将 requireJS 与 Google plus API 一起使用 但是当我单击登录按钮时出现错误 这是错误和屏幕截图 GET https apis google com scs apps static js k oz gapi e
  • 如何在pytorch中使用LSTM进行分类?

    我的代码如下 class Mymodel nn Module def init self input size hidden size output size num layers batch size super Discriminato
  • 在非活动类中显示进度对话框

    我正在尝试在非活动类中显示对话框 基本上 我在我的应用程序中检测到一个对象 我想显示一个对话框 然后切换活动 我在 logcat 中收到 java lang RuntimeException 无法在未调用 Looper prepare 的线
  • 链接方法时如何返回 false

    我有一个使用方法链的验证类 我希望能够进行单次检查TRUE FALSE像这样 if obj gt checkSomething 但也有像这样的链方法 if obj gt checkSomething gt checkSomethingEls