【问题标题】:Warning: Creating default object from empty value - with PHP function警告:从空值创建默认对象 - 使用 PHP 函数
【发布时间】:2016-07-31 05:01:36
【问题描述】:

我知道这是常见错误,我已阅读所有答案,但我的情况看起来不同,至少作为 PHP 新手,请不要根据问题主题决定行动。

我有一个可以工作的 PHP 代码,但我正在尝试将它安排在适当的函数中,如下面的代码所示,但我收到以下错误 Warning: Creating default object from empty value in /home/abc/vhosts/localhost/public/portfolio.php on line 16:

<?php

    // configuration
    require("../includes/config.php"); 

    // prepare portfolio object
    $portfolioObject = (object) ["portfolioSummaryArr" => [], "cashInHand" => ""];

    function getCashInHand(){
        // query database to get cash in hand
        $rows = CS50::query("SELECT cash FROM users WHERE username = ?", $_SESSION["username"]);

        // get first (and only) row
        $row = $rows[0];

        $portfolioObject->cashInHand = $row["cash"];
        $portfolioObject->portfolioSummaryArr = [11, 22, 33, 44, 55];
    }

    getCashInHand();

?>

现在在阅读了所有答案和文档之后,我认为我首先需要某种对象,所以我这样做了,然后我收到了这个错误 Parse error: syntax error, unexpected '$myObject' (T_VARIABLE) in /home/abc/vhosts/localhost/public/portfolio.php on line 12。我相信这一点,因为在 JS 中允许类似的东西并且它可以工作,但在 PHP 中的猜测不是,所以我的猜测是使用这样创建的对象你不能定义或访问函数。

$myObject = new stdClass();

$myObject->demoFunction = function(){
    echo "I am coming from demo function.";
}

$myObject->demoFunction(); 

对我来说,事情变得更有趣了,因为如果我在 require("../includes/config.php"); 之后在我的代码中执行以下操作,那么它可以工作并且没有错误,但是我的第一个代码 sn-p 中所示的函数定义和访问不起作用。

// Defining function
function whatIsToday(){
    echo "Today is XXX";
}
// Calling function
whatIsToday();

【问题讨论】:

  • 简短的回答是:变量范围。
  • @Dagon 感谢您的提示。我创建了$myObject = new stdClass(); 一个全局对象,然后将portfolioObject 定义为$myObject-&gt;portfolioObject = (object) ["portfolioSummaryArr" =&gt; [], "cashInHand" =&gt; ""]; 并以$myObject-&gt;portfolioObject-&gt;cashInHand = $row["cash"]; 访问,但仍然是同样的错误。我想现在我可以通过我的全局myObject 对象访问portfolioObject
  • 查看this answer 以获取有关如何调用您的方法的信息。但是unexpected $myobject 是由于函数定义后缺少;。在普通函数 def 中,;} 之后不会有终止,但你的是匿名函数的变量赋值。这是 PHP 在此处需要 ; 的语句... $myObject-&gt;demoFunction = function(){...};
  • 另外,如果您使用 array(x,y,z,...) 而不是括号表示法声明数组,则您不必做任何 (object) 的事情。
  • @Dagon 谢谢先生最初的提示,我明白了,并为未来的访客发布了我的答案。

标签: php


【解决方案1】:

我想说,这只是时间问题。我必须做一些阅读以了解如何利用 PHP 的面向对象。下面是我如何解决我的所有 PHP 错误和警告。不用说我最喜欢的调试方法“打印到屏幕/终端”,在 PHP 使用 echo 的情况下帮助很大。

<?php

    // configuration
    require("../includes/config.php"); 

    class portfolio{
        public $portfolioObject;

        public function __construct(){
            echo "__construct()</br>";
            $this->portfolioObject = new stdClass(); 
        }

        public function initialize(){
            echo "initialize()";
            $portfolioObject = (object) ["portfolioSummaryArr" => [], "cashInHand" => ""];
        }

        public function getCashInHand(){
            // query database to get cash in hand
            $rows = CS50::query("SELECT cash FROM users WHERE username = ?", $_SESSION["username"]);

            // get first (and only) row
            $row = $rows[0];

            $this->portfolioObject->cashInHand = $row["cash"];
            $this->portfolioObject->portfolioSummaryArr = [11, 22, 33, 44, 55];
        }

        public function setSessionObject(){
            $_SESSION["portfolioSummaryResults"] = $this->portfolioObject;
        }     
    }

    $myPortfolio = new portfolio();
    $myPortfolio->initialize();
    $myPortfolio->getCashInHand();
    $myPortfolio->setSessionObject();

    render("portfolio/portfolio_results.php", ["title" => "Portfolio"]);

?>

【讨论】:

    猜你喜欢
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    相关资源
    最近更新 更多