物件導向 V.S. 無限階層樹狀結構?

edited 十月 2013 in 進階PHP討論
在PHP4中,我似乎無法在一個物件的方法中呼叫同一個物件的方法(遞迴),可是這樣一來我就無法產生無限階層的樹狀結構?有人遇過類似問題嗎?

過去會撰寫類似這樣的函式:
function treeview($pid = 0)
{
  $sql = 'SELECT * FROM `cat` WHERE `pid` = '.$pid;
  ...
  treeview($data['pid']);
}

可是不知道如何在一個物件中實做類似功能。

會想要這麼做是因為已經撰寫了一個物件,希望為該物件增加處理無限階層樹狀結構的功能,但是產生了許多錯誤訊息:
Call to a member function on a non-object...

├140┤

原始討論: http://twpug.net/x/modules/newbb/viewtopic.php?topic_id=733

評論

  • edited 八月 2005
    以下寫了一個測試程式
    test 1是直接用呼叫object裡面的function,就會產生"Call to a member function on a non-object錯誤"
    test 2是先new一個object起來,就不會說是再呼叫一個non object了
    您可以把test 2部分的注解拿掉看看,希望對您有幫助.

    <?php

    class tree {

    function a($pid = 0) {
    $id = $pid;
    echo $id."<br>";
    $id--;
    if ($id >=0) $this->a($id);
    $data = "this is an Array";
    return $data;
    }

    }

    //test 1 會出現Call to a member function on a non-object錯誤
    $tree = tree::a($pid=3);

    //test 2
    /*
    $a = new tree;
    $tree = $a->a($pid=3);
    */

    echo $tree;
    ?>
  • edited 八月 2005
    做了一個小型測試程式:
    <?php
    /* Database Structure
    CREATE TABLE `test` (
    `id` INT( 5 ) UNSIGNED NOT NULL AUTO_INCREMENT ,
    `pid` INT( 5 ) UNSIGNED NOT NULL ,
    `name` VARCHAR( 10 ) NOT NULL ,
    PRIMARY KEY ( `id` )
    );
    INSERT INTO `test` VALUES (1, 0, 'item1');
    INSERT INTO `test` VALUES (2, 0, 'item2');
    INSERT INTO `test` VALUES (3, 1, 'item3');
    INSERT INTO `test` VALUES (4, 3, 'item4');
    INSERT INTO `test` VALUES (5, 4, 'item5');
    INSERT INTO `test` VALUES (6, 5, 'item6');
    INSERT INTO `test` VALUES (7, 5, 'item7');
    */
    
    mysql_connect('localhost', 'root', 'kiang');
    mysql_select_db('test');
    
    class tree
    {
    	function a($pid = 0, $pfx = '')
    	{
    		$sql = 'SELECT * FROM `test` WHERE `pid` = ' . $pid;
    		if($result = mysql_query($sql))
    		{
    			if(($num = mysql_num_rows($result)) > 0)
    			{
    				$pfx .= '-';
    				while($data = mysql_fetch_assoc($result))
    				{
    					echo $pfx . $data['name'] . '<br>';
    					this->a($data['pid'], $pfx);
    				}
    			}
    		}
    	}
    }
    
    $a = new tree;
    $a->a();
    ?>
    

    這會產生錯誤訊息
    Parse error: parse error, unexpected T_OBJECT_OPERATOR in c:\appserv\www\test4.php on line 34

    我之前的錯誤訊息,發生在物件的方法中試圖 new 一個同樣的物件。
Sign In or Register to comment.