【问题标题】:PHP class includes a file, but that file cannot access the classPHP 类包含一个文件,但该文件无法访问该类
【发布时间】:2017-05-31 08:01:10
【问题描述】:

我有一个 php 类,它使用“include”从文件中加载一些 html 和 php。在该文件中,我想访问包含该文件的类对象,但我不断收到“致命错误:在非对象上调用成员函数 makeSizesSelect() ...”

我尝试过 include 和 require,我尝试过声明全局变量,我已经尝试了我能想到的所有东西,以及到目前为止我在 SO 上找到的所有东西。似乎没有什么允许我包含的文件让 php 代码访问包含它的对象。

有什么想法吗?

这里有几个sn-ps ...

类文件:

class cdf {
   public $version = 001;

   public function cdf_shortcode( $atts,$content ) 
   {
      $this->slog( 2,"shortcode() case: show" );
      require( 'templates/container.php' );
   }
}

所需的文件 container.php 包含以下内容(以及其他内容):

<?php 
    echo "version = ".$this->version;
?>

然后我尝试使用该对象:

$cdf = new cdf();
$cdf->cdf_shortcode( null, null);

$this->slog( 2,"shortcode() case: show" ) 行有效。它运行该功能(我没有包含在这个 sn-p 中)就好了。但是我需要(或包含)的文件不能使用 $this 来访问该对象。我不知所措。 :-(

我要做的就是在包含的文件中访问包含该文件的类中的变量和方法...

抱歉,补充了一些信息。我不确定这是否有什么不同。上面的代码都是 WordPress 插件的一部分。

【问题讨论】:

  • 包含一个文件是不够的,你需要实例化你的类。
  • 因为在包含 $obj=new cdf(); 这样的类的创建对象之后,您还没有创建任何对象来访问您的类。然后访问成员函数,如 $obj->cdf_shortcode( '','' )
  • 我很抱歉。该类显然已实例化,并且该对象存在。正如我所说,简码函数的第一行有效。如果我没有实例化对象,情况就不会如此。

标签: php wordpress class include


【解决方案1】:

奇怪的问题和奇怪的解决方案。我终于在这里找到了答案:

Possible to access $this from include()'d file in PHP class?

我尝试了这张海报尝试的所有明显解决方案(全局变量、转换为另一个变量等),但同样缺乏成功。事实证明,只需将文件扩展名从 .php 更改为 .tmpl 即可解决问题,我的包含文件现在可以访问包含它的对象。奇怪的。 (当然,现在的缺点是我的 IDE 不会为我的代码着色。:-( )

谢谢你们的建议。

【讨论】:

  • 不确定你的问题是什么,对我来说似乎工作正常。我会再次更新我的答案。我也不确定你为什么要在方法中包含一个文件。
【解决方案2】:

在您包含的文件中,您需要实例化该类。

<?php
$yourClass = new cdf();
echo "version = ".$yourClass->version;
?>

当你想访问一个类中的一个函数时,你需要先实例化这个类,否则你将无法访问它里面的任何东西。

还要确保您所包含的文件不会被包含在类 cdf 不存在的其他任何地方,因为这会导致错误。

变量$this只有在同一个对象中才能访问方法、变量等。

根据您似乎有效的答案进行更新:

例子.php

<?php
echo $this->returnString();
echo $this->randomVariable;

文件.php

<?php
class IncludedClass
{
    public $randomVariable = 123;
    public function returnString()
    {
        return "some random string";
    }
    public function meh()
    {
        require_once('Example.php');
    }
}
$meh = new IncludedClass();
$meh->meh();

【讨论】:

  • 但这就是我不知所措的地方。我实例化对象,然后使用它。以我的思维方式,包含的文件是在类的方法中插入额外的代码,这就是为什么我期望 $this 能够工作,就像它在 include() 之前的行中所做的那样。
  • 通过使用$this-&gt;version;,代码假定您正在尝试访问与echo "version = ".$this-&gt;version; 在同一类中的变量。将$this 替换为您在其中实例化类的对象的名称。 $yourClass 在我的例子中。
  • 我刚刚尝试了您的解决方案,添加了 $mycdf = new cdf();回声“版本=”。$mycdf->版本;我仍然收到错误:致命错误:找不到类'cdf'。
  • 对不起亚瑟,你的例子与我的情况完全相反。您在包含的外部文件中定义了类。那不是我的问题。我的课程包含另一个包含更多代码的文件。在额外文件的代码中,我想访问包含该文件的类中的变量和方法。再次查看我上面的代码。
  • @CraigD 再次更新了答案。对我来说效果很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-25
  • 2013-05-11
  • 2016-01-03
  • 1970-01-01
相关资源
最近更新 更多