在较新的 PHP 版本中使用具有相同 CSS 选择器名称的 PHP 变量时出现问题

Posted

技术标签:

【中文标题】在较新的 PHP 版本中使用具有相同 CSS 选择器名称的 PHP 变量时出现问题【英文标题】:Problems using PHP variables with the same CSS selector names in newer PHP versions 【发布时间】:2014-02-22 21:47:30 【问题描述】:

我在一个电子商务网站上工作,作为 Treehouse.com 的在线 php 课程的一部分。我遇到了一个问题,其中一个菜单项显示不正确,如下所示:http://herkuhleez.com/shirts4mike/

在他们的论坛中寻找答案后,另一位学生得出结论,这是新版本 PHP 的问题,因为旧版本没有显示问题,代码与此处看到的完全相同:http://cheetahcandy.com/shirts4mike/

第一个示例(有错误)正在运行 PHP 版本 5.4.24,第二个示例正在运行 5.2.17。我的本地主机服务器正在运行 5.5.6,我遇到与第一个示例相同的错误。

然而,这个学生发现了一个在较新版本中的解决方法,只需更改与 css 选择器名称相同的任何 php 变量名称,至少当 php 写入标签的类属性时。

我的问题是:这是这些较新版本的 PHP 中的错误,还是作为某种自动更正功能按预期工作?

编辑* 这是 Treehouse 的论坛讨论:https://teamtreehouse.com/forum/build-a-simple-php-application-adding-active-states-to-the-navigation-php-versions

【问题讨论】:

我从未听说过,而且您的浏览器看不到任何 PHP 变量。你能提供一些代码吗? 我已经阅读了您的问题 4 次,但对于您的问题或问题所在,我仍然一无所知。 PHP 不知道 CSS,反之亦然。 CSS 和 PHP 之间没有关联。一定有其他事情发生。 PHP 是服务器端的。 CSS 是客户端。没有互动。你找错地方了。 为什么这么多票投给了这个刚刚错过了自己的 CSS 样式的可怜人.. 【参考方案1】:

如果您查看网站上出现错误的 CSS,您会注意到您的课程 .section.shirts 在 style.css 的第 605 行具有以下 css

padding-bottom: 42px;
background: #fff

有趣的是,如果你把这两个都去掉,它看起来和另一个网站完全一样。

另外,这个类里面也有错误:

shirts <br /> <b>Notice</b>: Undefined variable: section in <b>/home4/herkuhle/public_html/shirts4mike/inc/header.php</b> on line <b>17</b><br /> 

我会查看第 17 行的 header.php,看看是什么原因造成的。

【讨论】:

虽然风格对情况没有帮助,但这绝对不是问题所在。该样式存在于另一个示例站点上,它是由错误section 在类中的双引号内创建的单词的存在,这是导致应用它的错误的结果。该样式可能会在其他地方用于完全不同的目的,最好不要更改它并修复 PHP 错误。【参考方案2】:

更多信息

编辑:这个问题似乎与教育网站上可用的预定义项目有关。 OP 似乎对为什么完全相同的代码在某些服务器上失败,而 似乎 在其他服务器上工作感到困惑。他们认为这与 PHP 版本有关。这更有可能是由于服务器端警告的抑制。对于suppress warnings,您可以简单地添加:

error_reporting(E_ERROR | E_PARSE);

但是;正确定义或测试变量[在这种情况下为 $section] 而不是简单地掩盖问题会好得多。

使用名为 $section 的 PHP 变量以及同名的 CSS 选择器将起作用

..仅仅因为您可以做某事,并不意味着您应该..

无论如何,这本身并不是 CSS 错误,但在这种情况下肯定没有帮助。

请注意,您的代码中的错误/警告包含 section 一词:

<li class="shirts <br /> <b>Notice</b>: Undefined variable: section ....."> 

两个示例都有一个名为 section.shirts 的 CSS 样式:

.section.shirts 
    background: none repeat scroll 0 0 #FFFFFF;
    padding-bottom: 42px;

由于放置错误/警告,大多数浏览器会将您的类解释为包含引号中的任何单词(例如,shirtsundefinedsection 等)并将它们全部应用如果在您的 CSS 中找到样式。在您的页面版本中,由于放置了错误,您正在应用上面的样式。另一个站点在类中的双引号内没有带有单词section 的错误/警告,因此它不会应用该特定样式。


PHP 变量和 CSS 选择器之间没有相关性(阅读:PHP 变量和 CSS 选择器名称/变量在当前、旧版本或我敢说、未来版本的 PHP 中没有冲突)除非你不幸的是,在生成的 HTML 中生成错误。在这种情况下,您通过在类内的双引号之间创建错误来完成此操作。

修正您的错误,您的样式将按预期应用。这里没有错误(代码中的第 17 行除外 :)

在没有看到您的代码的情况下,修复您的错误/警告:

    [不太可能] 如果代码中的某个地方缺少 $,可能会在 section 前面添加一个 $(例如 $section

    在你的 if 语句中测试它之前,可能要确保你定义了 $section

    如果您不知道 $section 之前是否已初始化,则可以在测试 $section 时使用 isset。

因此,总而言之,单词 section 在您的 HTML 中呈现在错误/警告中,并被解释为所讨论的 CSS 类结构的一部分。

为什么它适用于旧版本的 PHP?

如果您想知道为什么它在其他环境中也可以工作,您是否考虑过它可能与 PHP 版本无关 - 可能在其他具有相同错误/警告的环境中,他们已配置 PHP 以抑制错误显示和或警告。

如果没有错误,section 这个词就不会出现在您的班级中; ergo - 没有风格问题。

来自 PHP 手册:

依赖于未初始化变量的默认值是 在将一个文件包含到另一个使用 相同的变量名。这也是一个重大的安全风险 register_globals 开启。在以下情况下发出 E_NOTICE 级别错误 使用未初始化的变量,但不是在 将元素附加到未初始化的数组。 isset() 语言 构造可用于检测变量是否已经 初始化。

有关您的特定错误的更多信息,请参阅此previous 答案。

【讨论】:

谢谢达米安。经检查,代码没有显式初始化$section 变量。我对 PHP 很陌生,你的解释很到位,我对此更明智。再次感谢。 我不知道你是否注意到,但在该教程的额外信用部分(视频下方的部分):为页面创建一个新的 PHP 文件,确保设置 $段变量。 - 我不知道那是否一直存在..? 呵呵我没注意。再次感谢:)【参考方案3】:

只要看看您的 HTML 标记,您就会发现以下 php 通知:

<b>Notice</b>:  Undefined variable: section in <b>/home4/herkuhle/public_html/shirts4mike/inc/header.php</b> on line <b>17</b>

只需查看第 17 行附近的 header.php 文件即可。您的问题是此 php 通知的后续问题。看起来 css 类的定义不正确。

【讨论】:

这不是造成他问题的原因,尽管他需要看看。 正确回答他的问题:不,这不是较新 PHP 版本的错误。要更详细地回答,我必须知道 header.php 文件中的 PHP 代码,这里没有给出。所以是的……他必须自己看看。 哈哈 实际上,如果您花 2 秒时间检查页面上的元素,他的问题就很明显了。如果你想知道,请查看我的回答。 你的答案正是我所说的......随便......去拿你的分数。 :D 不,不是你说的那样,你一次也没有提到 CSS。你说他的问题是头文件中的 PHP,虽然那里有问题,但这不是导致他询问的视觉错误的原因。

以上是关于在较新的 PHP 版本中使用具有相同 CSS 选择器名称的 PHP 变量时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

使用3D Touch防止在较新的iPad上拖动图像和链接

较新的 Xcode 版本中缺少“空应用程序”(Objective-C)

在 android 中获取位置无法在较新的设备上运行

为啥在较新的 Android 设备上预检失败,但在较旧的设备和台式机上却没有?

FCM - 为啥在较新的 Firebase Admin SDK 中不再支持 FCM 直接通道?

在提取数据库中重复行的查询结果中仅选择较新的记录