Newbie to Classes, I need some Guru help

Discussion in 'PHP' started by cesarcesar, Jun 4, 2007.

  1. #1
    I'm trying to build my first PHP Class. After days of tweaking, im lost. I am used to working with functions and arrays, but wrapping them in classes is confusing me.

    The following code is to return an Array Collection representative of a folder and sub folder in a directory of choice. It doesn't work. Throws an error "Call to undefined function: parse_dir()". It would be great if someone out there could see where im not correct.

    I've been trying to follow the example provided at http://www.sephiroth.it/tutorials/flashPHP/flex_remoteobject/page003.php
    <?
    class Tree {
        var $folders;
        var $files;
        var $name;
        // explicit actionscript package
        var $_explicitType = "tutorials.Tree";
    }
    
    class DirTree {
    
        /**
         * Get a tree of folders and files from a spec dir
         * @returns An ArrayCollection of Tree
         */
    	function DirTree( $dir_tree ){
    
    		$t = array();
    		$_tree = parse_dir($dir_tree);
    
    		for($a = 0; $a < count($_tree); $a++){
    			$tree = new Tree();
    			$tree->folders = $_tree[$a][0];
    			$tree->files = $_tree[$a][1];
    			$tree->name = $_tree[$a][2];
    			$t[] = $tree;
    		}
    
    		return $t;
    	}
    
        /**
         * Get a tree of folders and files from a spec dir
         * @returns An Array of Tree
         */
    	function parse_dir( $folder ){
    
    		$dir                = @opendir( $folder );
    		$fname              = array_pop( explode( "/",$folder) );
    		$fname              = empty( $fname ) ? "root" : str_replace( " ","_",$fname );
    		$path               = "";
    		$filecount          = 0;
    		$foldercount		= 0;
    		$xml                = "";
    		$tree				= array();
    		$limb				= array();
    
    		while ( false != ( $item = @readdir( $dir ) ) ) {
    
    			if( $item == "." || $item == ".." ) continue;
    
    			if( is_dir( "$folder/$item" ) ){
    
    				$tree[][$folder] = parse_dir( "$folder/$item");
    				$foldercount++;
    				$limb['folders'] = $foldercount;
    				$filecount++;
    				$limb['files'] = $filecount;
    				continue;
    
    			}
    
    			$limb['name'] = $item;
    		}
    
    		$tree[] = $limb;
    		return $tree;
    
    	}
    }
    
    $class = new DirTree("path_to_folder"); // "../../example_folder"
    echo $class->DirTree();
    ?>
    
    Code (markup):
    Thanks.
     
    cesarcesar, Jun 4, 2007 IP
  2. nico_swd

    nico_swd Prominent Member

    Messages:
    4,153
    Likes Received:
    344
    Best Answers:
    18
    Trophy Points:
    375
    #2
    
    $this->parse_dir($dir_tree);
    
    PHP:
    Use $this or self (if PHP 5) to access variables and methods in the same class.
     
    nico_swd, Jun 4, 2007 IP
  3. cesarcesar

    cesarcesar Peon

    Messages:
    188
    Likes Received:
    1
    Best Answers:
    0
    Trophy Points:
    0
    #3
    Thanks. New code still no work.

    <?
    class Tree {
        var $folders;
        var $files;
        var $name;
        // explicit actionscript package
        var $_explicitType = "tutorials.Tree";
    }
    
    class DirTree {
    
        /**
         * Get a tree of folders and files from a spec dir
         * @returns An ArrayCollection of Tree
         */
    	function DirTree( $dir_tree ){
    
    		$t = array();
    		$_tree = $this->parse_dir($dir_tree); //parse_dir($dir_tree);
    
    		for($a = 0; $a < count($_tree); $a++){
    			$tree = new Tree();
    			$tree->folders = $_tree[$a];
    			$tree->files = $_tree[$a];
    			$tree->name = $_tree[$a];
    			$t[] = $tree;
    		}
    
    		return $t;
    	}
    
        /**
         * Get a tree of folders and files from a spec dir
         * @returns An Array of Tree
         */
    	function parse_dir( $folder ){
    
    		$dir                = @opendir( $folder );
    		$fname              = array_pop( explode( "/",$folder) );
    		$fname              = empty( $fname ) ? "root" : str_replace( " ","_",$fname );
    		$path               = "";
    		$filecount          = 0;
    		$foldercount		= 0;
    		$xml                = "";
    		$tree				= array();
    		$limb				= array();
    
    		while ( false != ( $item = @readdir( $dir ) ) ) {
    
    			if( $item == "." || $item == ".." ) continue;
    
    			if( is_dir( "$folder/$item" ) ){
    
    				$tree[][$folder] = $this->parse_dir("$folder/$item"); //parse_dir( "$folder/$item");
    				$foldercount++;
    				$limb['folders'] = $foldercount;
    				$filecount++;
    				$limb['files'] = $filecount;
    				continue;
    
    			}
    
    			$limb['name'] = $item;
    		}
    
    		$tree[] = $limb;
    		return $tree;
    
    	}
    }
    
    $class = new DirTree("../../flashservices");
    echo $class->DirTree();
    ?>
    Code (markup):
     
    cesarcesar, Jun 4, 2007 IP
  4. cesarcesar

    cesarcesar Peon

    Messages:
    188
    Likes Received:
    1
    Best Answers:
    0
    Trophy Points:
    0
    #4
    i have made some updates from suggestions and still get errors. Here is new code.
    
    <?
    class Tree {
        var $folders;
        var $files;
        var $name;
        // explicit actionscript package
        var $_explicitType = "tutorials.Tree";
    }
    
    class DirTree {
    
        /**
         * Get a tree of folders and files from a spec dir
         * @returns An ArrayCollection of Tree
         */
    	function DirTree( $dir_tree ){
    
    		$t = array();
    		$_tree = $this->parse_dir($dir_tree);
    
    		for($a = 0; $a < count($_tree); $a++){
    			$tree = new Tree();
    			$tree->folders = $_tree[$a][0];
    			$tree->files = $_tree[$a][1];
    			$tree->name = $_tree[$a][2];
    			$t[] = $tree;
    		}
    
    		return $t;
    	}
    
        /**
         * Get a tree of folders and files from a spec dir
         * @returns An Array of Tree
         */
    	function parse_dir( $folder ){
    
    		$dir                = @opendir( $folder );
    		$fname              = array_pop( explode( "/",$folder) );
    		$fname              = empty( $fname ) ? "root" : str_replace( " ","_",$fname );
    		$path               = "";
    		$filecount          = 0;
    		$foldercount		= 0;
    		$xml                = "";
    		$tree				= array();
    		$limb				= array();
    
    		while ( false != ( $item = @readdir( $dir ) ) ) {
    
    			if( $item == "." || $item == ".." ) continue;
    
    			if( is_dir( "$folder/$item" ) ){
    
    				$tree[][$folder] = parse_dir( "$folder/$item");
    				$foldercount++;
    				$limb['folders'] = $foldercount;
    				$filecount++;
    				$limb['files'] = $filecount;
    				continue;
    
    			}
    
    			$limb['name'] = $item;
    		}
    
    		$tree[] = $limb;
    		return $tree;
    
    	}
    }
    
    $class = new DirTree();
    
    /* view array  */
    echo "<pre>";
    print_r($class->DirTree("../../flashservices"));
    echo "</pre>";
    ?>
    
    Code (markup):
    Here is an XML view of what the structure should be like.
    <folder name="root" folders="1" files="2">
    	<file>advancedsettings.php</file>
    	<file>adodbAdapter.php</file>
    	<folder name="adapters" folders="1" files="5">
    		<file>adodbAdapter.php</file>
    		<file>arrayfAdapter.php</file>
    		<file>arrayftAdapter.php</file>
    		<file>fbsqlAdapter.php</file>
    		<file>informixAdapter.php</file>
    		<folder name="custom" folders="0" files="2">
    			<file>CachedExecutionAction.php</file>
    			<file>CachedGateway.php</file>
    		</folder>
    	</folder>
    </folder>
    Code (markup):
     
    cesarcesar, Jun 4, 2007 IP
  5. Aragorn

    Aragorn Peon

    Messages:
    1,491
    Likes Received:
    72
    Best Answers:
    1
    Trophy Points:
    0
    #5
    the function DirTree() is the class constructor and is automatically called when the new object of the class is created. Since the function requires a required argument, you should instantiate the class like this.
    
    $class = DirTree("../../flashservices");
    
    PHP:
    Or try this code
    
    <?
    class Tree {
        var $folders;
        var $files;
        var $name;
        // explicit actionscript package
        var $_explicitType = "tutorials.Tree";
    }
    
    class DirTree {
    
        /**
         * Get a tree of folders and files from a spec dir
         * @returns An ArrayCollection of Tree
         */
    	function DirTree(){
    
    	}
    	function getTree( $dir_tree ){
    		$t = array();
    		$_tree = $this->parse_dir($dir_tree);
    
    		for($a = 0; $a < count($_tree); $a++){
    			$tree = new Tree();
    			$tree->folders = $_tree[$a][0];
    			$tree->files = $_tree[$a][1];
    			$tree->name = $_tree[$a][2];
    			$t[] = $tree;
    		}
    
    		return $t;
    	}
    
        /**
         * Get a tree of folders and files from a spec dir
         * @returns An Array of Tree
         */
    	function parse_dir( $folder ){
    
    		$dir                = @opendir( $folder );
    		$fname              = array_pop( explode( "/",$folder) );
    		$fname              = empty( $fname ) ? "root" : str_replace( " ","_",$fname );
    		$path               = "";
    		$filecount          = 0;
    		$foldercount		= 0;
    		$xml                = "";
    		$tree				= array();
    		$limb				= array();
    
    		while ( false != ( $item = @readdir( $dir ) ) ) {
    
    			if( $item == "." || $item == ".." ) continue;
    
    			if( is_dir( "$folder/$item" ) ){
    
    				$tree[][$folder] = $this->parse_dir( "$folder/$item"); // Changed parse_dir to $this->parse_dir
    				$foldercount++;
    				$limb['folders'] = $foldercount;
    				$filecount++;
    				$limb['files'] = $filecount;
    				continue;
    
    			}
    
    			$limb['name'] = $item;
    		}
    
    		$tree[] = $limb;
    		return $tree;
    
    	}
    }
    
    $class = new DirTree();
    
    /* view array  */
    echo "<pre>";
    print_r($class->getTree("../../flashservices"));
    echo "</pre>";
    ?>
    PHP:
     
    Aragorn, Jun 4, 2007 IP