为什么我在 PHP 中的 getter 和 setter 看不到我私下声明的变量?(它们都在同一个班级)


Why can't my getters and setters in PHP see my privately declared variables? (They're all in the same class)

我正在为学校做一个研究项目抓取密码学家的数据。我有一个非常简单的类,它转到一个网页,输入该页面的每个href链接,并将它们写入文件。

当我运行代码时,我实际上并没有收到特定的错误,但现在它只是写入一个空白文件。我的问题似乎是我的 getter 和 setter 不知道我的私有实例变量,此外,我的对象 ($obj) 似乎不知道我的 getter 和 setter,所以我有点困惑。

我正在使用 JetBrains PHPStorm。感谢大家的帮助和支持

编辑:我已经更新了下面的代码,它会运行得很好。对于任何有兴趣使用它的人 - 此代码将从网页上删除所有链接,并将每个链接的内容存储在文件中。我可能最终会修改它以去除所有 html,以便我只获取原始文本,然后对输出进行 JSON 编码,以便可以轻松解析。

<?php
class Scraper
{
    /*
    =============================================
    SET UP THE BASE DIRECTORY FOR SCRAPING,
    AND OPEN FILES TO WRITE INFORMATION TO
    ==============================================
    */
    private $basedir; //BASE DIRECTORY PATH FOR SCRAPING
    private $outfile; //NAME OF FILE TO WRITE TO
    /*
    =============================================
    SETTER FOR BASE DIRECTORY
    ==============================================
    */
    public function setBaseDirectory($base)
    {
        $this->basedir = $base;
    }
    /*
    =============================================
    SETTER FOR OUTFILE
    ==============================================
    */
    public function setOutfile($file)
    {
        $this->outfile = $file;
    }
    /*
    =============================================
    GETTER FOR OUTFILE
    ==============================================
    */
    public function getOutfile()
    {
        return $this->outfile;
    }
    /*
    =============================================
    GETTER FOR BASE DIRECTORY
    ==============================================
    */
    public function getBaseDirectory()
    {
        return $this->basedir;
    }

    /*
    =============================================
    THIS FUNCTION TAKES THE HYPERLINKS OUT OF
    A WEB PAGE AND RETURNS THEM IN AN ARRAY.
    ITS SCOPE IS PRIVATE SINCE IT IS A HELPER
    METHOD FOR GETDIRCONTENTS
    =============================================
    */
    private function grabLinks($contents)
    {
        $last_dir = array();
        $URLs = array();
        preg_match_all("|href=['"'](.*?)['"']|", $contents, $match);
        foreach ($match as $key => $value)
            foreach ($value as $key2 => $TheUrl)
                $URLs[] = $TheUrl;
        for ($i =0; $i < (count($URLs)/2);$i++)
        {
            $item = str_replace('href=','',(string)$URLs[$i]);
            $item = str_replace('"','',$item);
            array_push($last_dir, $item);
        }
        return $last_dir;
    }

    /*
    =============================================
    THE GOAL OF THIS FUNCTION IS TO GET THE
    CONTENTS OF EACH FORUM POST AND WRITE THEM
    INTO A FILE. MAY EXPLORE CREATING AN
    ASSOCIATIVE ARRAY AND JSON_ENCODING THEM
    BASED ON NAME = POST NAME VALUE = FILE CONTENTS
    =============================================
    */
    public function getDirContents($dir)
    {
        $contents = file_get_contents($dir);
        $linksArray = $this->grabLinks($contents);
        for ($i = 0; $i < count($linksArray);$i++)
        {
            $contents = strip_tags(file_get_contents($dir.$linksArray[$i])); //GET CONTENTS OF FILE FROM LINK
            fwrite($this->getOutfile(), $contents);
            $debug = fopen("debugLog.txt", "w");
            fwrite($debug, "debug contents: 'n'n".$this->getOutfile().$this->getBaseDirectory()." $contents 'n'n");
        }
    }
}
/*
=============================================
CREATE NEW INSTANCE OF CLASS AND CALL FUNCTION
TO GET CONTENTS OF DIRECTORY ITEMS
==============================================
*/
$obj = new Scraper();
$obj->setBaseDirectory("http://satoshi.nakamotoinstitute.org/posts/");
$obj->setOutfile(fopen("Satoshi_Forum_Posts.txt", "w"));
$obj->getDirContents($obj->getBaseDirectory());
echo $obj->getBaseDirectory();
echo $obj->getOutfile();
好的

,我已经能够找到问题的根源,我很抱歉浪费了那些在上面发表评论的人的时间。事实证明,我的 PHP 代码很好,并且在我进行了 1 次更改后运行。

我刚刚开始使用 JetBrains PHPStorm IDE,并将此类文件从我的桌面而不是 JetBrains 的工作区加载到编辑器中。一旦我合并了 Bulk 和 Jonathan Kuhn 提到的小语法更改,我在设置程序时定义的工作区内在 JetBrains 中创建了一个新项目,所有警告消息都消失了(我仍然不完全理解为什么它们消失了)。

我运行了我的代码并产生了所需的结果。我将在问题中发布更新的代码以及注释中建议的更新,以便任何需要此类脚本的人都可以使用它。再次感谢所有愿意提供帮助的人!