【问题标题】:how to create a class from a variable in PHP?如何从 PHP 中的变量创建类?
【发布时间】:2022-07-31 18:16:05
【问题描述】:

我想在循环中创建一些类,我在变量中给出类的名称。
我收到一个错误:
致命错误:未捕获的错误:类名必须是有效对象或...中的字符串
我该怎么做?

<?php

$xml = simplexml_load_file('routes.xml');

$routes = $xml->Route;

    for($i =0; $i<count($routes); $i++){

        $uri = $routes[$i]->attributes()->uri;
        $name = $routes[$i]->attributes()->name;


        Route::set($uri, function(){
            $name::CreateView();
        });

    }
?>

文件 XML

<?xml version="1.0" encoding="utf-8" ?>
<Routes>
    <Route name="Home" uri="" controller="Home"/>
    <Route name="AboutMe" uri="o-mnie" controller="AboutMe"/>
    <Route name="Interests" uri="o-mnie/zainteresowania" controller="AboutMe" method="interests"/>
    <Route name="Contact" uri="kontakt" controller="Contact"/>
</Routes>

【问题讨论】:

  • 为什么要这样做?你有一个带有静态函数 CreateView 的 Home 类吗?那是什么设计模式?
  • 是的,我有一个带有静态函数 CreateView 的 Home 类,我只想使用一个变量作为类名,但我不知道如何
  • 为什么 PHP 生态系统仍然如此热衷于使用字符串、数组和反射?为什么要使用 XML 发明自己的 MVC 框架?像这样的代码属于框架,如果您不知道如何编写和调试自己的框架,请使用现有的框架。错误非常简单:$name 中的任何内容都不是字符串。研究该错误并调试您的代码。您可能还想阅读controller 属性,而不是name。此外,在您的设计中,您需要在 XML 中创建一个控制器类一个 Routes 条目才能使其正常工作。
  • @CodeCaster,我个人认为学习如何编写自己的框架的最佳方法是反复试验。很常见的是,我理解为什么要做的事情更多地取决于我面临的错误和问题,而不是仅仅编写有效的代码。尽管我认为这一点超出了回答此类问题的范围 - 恕我直言。
  • @Nigel 当然,编写自己的 MVC 框架来掌握 HTTP 和 URL 路由的工作原理是很好的。但是,如果您无法阅读和研究运行时错误并调试代码(例如,将变量转储到输出或 $deity 禁止使用调试器检查变量以查看它们实际包含的内容),那么创建 MVC 框架可能是一座桥太远了。

标签: php xml class


【解决方案1】:

当您从 SimpleXML 文档中获取属性时,返回值是 SimpleXMLElement。

所以如果你要var_dump($name),你会得到类似...

class SimpleXMLElement#8 (1) {
  public ${0} =>
  string(4) "Home"
}

这种转换通常是在一个方法知道它需要一个字符串时隐式完成的,但在这种情况下它不需要。最简单的方法是将其转换为字符串...

$name = (string)$routes[$i]->attributes()->name;

您的第二个问题是一般范围错误(一个很好的解释是在Reference: What is variable scope, which variables are accessible from where and what are "undefined variable" errors?)...

Route::set($uri, function() use ($name) {
        $name::CreateView();
    });

【讨论】:

  • 我使用了你的方法,但我一直收到同样的错误
  • @karamba,错误在哪一行?错误仍然完全一样还是该类不存在?
  • 我还收到另一个“未定义变量”错误,“$ name :: CreateView ();”所以我得到这两个错误,好像 $ name 没有通过
  • @karamba,查看更新的代码。
猜你喜欢
  • 2017-04-04
  • 1970-01-01
  • 2016-03-19
  • 1970-01-01
  • 2012-03-21
  • 1970-01-01
  • 2014-06-15
  • 1970-01-01
  • 2021-12-13
相关资源
最近更新 更多