Avatar billede xicrow Nybegynder
12. maj 2008 - 20:18 Der er 22 kommentarer og
3 løsninger

Ordentlig forståelse af OOP

Hej eksperter.

Jeg er for noget tid siden begyndt at interessere mig for klasser, og OOP i PHP. Derfor har jeg efterhånden læst 100+ tutorials og artikler om OOP, samt (bogstavelig talt) gennemsøgt og gennemlæst alt hvad jeg kunne finde om emnet her på eksperten.

For at bruger alt min nyfundne viden til noget fornuftigt, har jeg sat mig for at lave et CM-System, hvori man kan tilføje/fjerne moduler, hvor så meget som muligt er bygget op i klasser.

Det skal siges at jeg har før lavet CM-Systemer programmeret i Procedural PHP, og ser stærkt frem til noget mere overskuelig kode ;)

Det jeg mangler er en forståelse for hvodan man korrekt opbygger, og bruger klasser, samt en uddybende forklaring af Model-View-Controller.

Hvis der er nogen der har lavet noget lignende hvad jeg har tænkt, og har lyst til at dele deres erfaring vil det glæde mig meget.

Jeg er også at fange på MSN, hvis der er nogen der vil hjælpe mig derigennem, på xicrow[elefantnæse-a]gmail[prik]com.

Håber der er nogen der kan/vil hjælpe mig

/xicrow
Avatar billede arne_v Ekspert
12. maj 2008 - 21:06 #1
Model = data holdende og aendrende kode
View = praesentation af data kode
Controller = bruger action processende kode

brugeren ser View
bruger goer noget som kalder Controller
Controller opdaterer Model
Model informerer View om at der skal refreshes (*)
brugeren ser nyt View

*) bruges i rigtig MVC - er ikke muligt i web p.g.a. restriktioner i HTTP
Avatar billede xicrow Nybegynder
13. maj 2008 - 00:45 #2
Hvis jeg forstår dig rigtigt arne, vil det sige at:

Model = f.eks. en mysql database eller andet lignende
View = brugergrænsefladen (GUI), <form>'s og lignende
Controller = kode der på en eller anden måde opdaterer "Model" (mysql-db)

Lille eksempel - Opret bruger:
Via VIEW indtaster en besøgende sine oplysninger, disse oplysninger bliver sendt til CONTROLLER, som så opdatere MODEL.

Ret mig hvis jeg har taget fejl

Ps. Beklager hvis jeg blot skriver det samme som dig på min egen måde, men sådan lærer jeg bedst ;)

/xicrow
Avatar billede arne_v Ekspert
13. maj 2008 - 00:54 #3
Model er ikke databasen.

Model er nogle objekter.

Data i Model vil ofte blive hentet fra og gemt i databasen, gennem nogle andre lag
som ikke er en del af MVC.
Avatar billede xicrow Nybegynder
13. maj 2008 - 01:05 #4
Hvad mener du helt præcist med at "Model er nogle objekter" ? Og hvad er Model's funktion så ?

/xicrow
Avatar billede arne_v Ekspert
13. maj 2008 - 01:09 #5
At Model er nogle objekter med nogle data og nogle metoder.

Model indeholder logikken.

Har du læst http://en.wikipedia.org/wiki/Model-view-controller ?
Avatar billede xicrow Nybegynder
13. maj 2008 - 01:26 #6
Ikke endnu, men den kan da gøre godt for lidt natlæsning ;)

Har du ellers nogle gode råd, eller hints, til korrekt opbygning af klasser ?

Har forsøgt mig med at lave en klasse til at administrere sider, samt deres indhold, men syntes bare det ligner en bunke funktioner som jeg normalt ville lave det i procedural PHP, med class {} rundt om :P

Den måde jeg har opbygget den på er nogenlunde således:
class pagetext
{
# Variabler for klassen
private $conn, $db_host, $db_user, $db_pass, $db_db, $html;

function __construct ()
  {
  # Sætter variabler for forbindelse til databasen
  }

function create_page($conn)
  {
  # Opretter en side, komplet med forms, samt if-sætninger til at tjekke
  }

function edit_page($conn)
  {
  # Redigere en side, komplet med forms, samt if-sætninger til at tjekke
  }

function delete_page($conn)
  {
  # Slette en side, komplet med forms, samt if-sætninger til at tjekke
  }

function display_html()
  {
  # Viser den html der er blevet genereret af en af de ovenstående klasser
  }
}

Eksempel på kald af klassen:

$pagetext = new pagetext;
$pagetext->create_page($conn);
$pagetext->display_html();

Inde i klassen er alt ellers klart, både med at vise den nødvendige HTML, samt håndtering af data fra form-felter, og gemme data i database.

Er det den korrekte/normale måde at gøre det på ?

/xicrow
Avatar billede arne_v Ekspert
13. maj 2008 - 01:32 #7
Nu er jeg ikke god til OOP i PHP, men hvis jeg nu antager at det er ligesom OOP i alt
muligt andet så.

Du skal ikke have connection som argument til klassens metoder når den er et field i klassen.
Avatar billede arne_v Ekspert
13. maj 2008 - 01:36 #8
Jeg kan ikke lære dig OOP på 20 linier.

Men jeg kan give dig et godt kriterie for om din klasse er på rette spor eller ej.

Hvis du kan lave 2 udgaver af samme klasse, hvor den ene gemmer data i en database
og den anden gemmer i XML filer, og den kode som bruger din klasser kan virke med
begge versioner uden ændringer, så er du på vej i den rigtige retning.
Avatar billede xicrow Nybegynder
13. maj 2008 - 01:42 #9
Nej det kan jeg egentlig godt se, en skrivefejl :P

Men er det ellers korrekt/normalt at have al HTML, samt data-håndtering statisk inde i klassen ?

Prøver lige at smide hele koden til klassen ind, så du kan se hvordan jeg har opbygget den, samt hvad der er statisk, og hvad der ikke er (fungerende kode):
class pagetext
{
# Variables
    var $conn;
    var $table;
    var $url;
    var $width;
    var $html;

# Functions
    # Set the connection-string
    function set_conn($conn)
        {
        $this->conn = $conn;
        }
    # Set the database-table to be used
    function set_table($table)
        {
        $this->table = $table;
        }
    # Set the url from where the script is run
    function set_url($url)
        {
        $this->url = (strpos($url, '?') !== false) ? $url.'&' : $url.'?';
        }
    # Set the width of the table design
    function set_width($width)
        {
        $this->width = $width;
        }
   
    # Check if database-table exists
    function check_db_table()
        {
        if (!mysqli_query($this->conn, 'select page_id from '.$this->table.''))
            {
            return false;
            }
        else
            {
            return true;
            }
        }
    # Create the database-table
    function create_db_table()
        {
        $query = 'create table `'.$this->table.'` ('.
                '`page_id` int(11) NOT NULL auto_increment,'.
                '`page_name` varchar(200) default NULL,'.
                '`page_type` varchar(50) default NULL,'.
                '`page_status` varchar(50) default NULL,'.
                '`page_content` longtext,'.
                '`page_keywords` longtext,'.
                '`page_description` longtext,'.
                '`page_hits` int(11) default NULL,'.
                'PRIMARY KEY  (`page_id`))';
       
        echo '
        <h6>Pagetext - Create table in database</h6>
        <br />';
       
        if (mysqli_query($this->conn, $query))
            {
            echo '
            <div class="nb_box_green">
            Table created successfully
            </div>';
            }
        else
            {
            echo '
            <div class="nb_box_orange">
            An error occured
            <br /><br />
            MySQL error-report:<br />
            '.mysqli_error($this->conn).'
            </div>';
            }
       
        echo '
        <br />
        <a href="'.$this->url.'">Click here to return to your page</a>';
        }
    # Delete the database-table
    function delete_db_table()
        {
        $query = 'drop table if exists `'.$this->table.'`';
       
        if (mysqli_query($this->conn, $query))
            {
            echo '
            <h6>Pagetext - Delete table from database</h6>
            <br />
            <div class="nb_box_green">
            Table deleted successfully
            </div>';
            }
        else
            {
            echo '
            <h6>Pagetext - Delete table from database</h6>
            <br />
            <div class="nb_box_orange">
            An error occured
            <br /><br />
            MySQL error-report:<br />
            '.mysqli_error($this->conn).'
            </div>';
            }
        }
   
    # Overview of pages (controller function)
    function pagetext_overview()
        {
        if (!isset($_GET["action"]))
            {
            if (!$this->check_db_table())
                {
                echo '
                <h6>Pagetext - Error</h6>
                <br />
                <div class="nb_box_orange">
                The table "'.$this->table.'" was not found in the database.<br /><br />
                <center>
                Would you like to create it now ?<br />
                <button class="form_submit" onclick="java script:window.location.href=\''.$this->url.'action=db_create_table\';">Yes, create the table now</button>
                </center>
                </div>';
                }
            else
                {
                $all_pages = mysqli_query($this->conn, 'select * from '.$this->table.'');
               
                $this->html = '
                <h6>Pagetext - Overview</h6>
                <br />
               
                <table width="'.$this->width.'" border="0" cellspacing="0" cellpadding="2">
                <tr>
                    <td colspan="6">
                    <p>
                    Here you can see all the pages you currently have.<br />
                    If you want to create a new page, use the link below:<br />
                    <a href="'.$this->url.'action=new">Create new page</a>
                    </p>
                    <br />
                    </td>
                </tr>
               
                <tr>
                    <td align="left" style="border-bottom:1px solid #999999;">
                    <p>Id</p>
                    </td>
                   
                    <td align="left" style="border-bottom:1px solid #999999;">
                    <p>Name</p>
                    </td>
                   
                    <td align="left" style="border-bottom:1px solid #999999;">
                    <p>Type</p>
                    </td>
                   
                    <td align="right" style="border-bottom:1px solid #999999;">
                    <p>Status</p>
                    </td>
                   
                    <td align="right" style="border-bottom:1px solid #999999;">
                    <p>Hits</p>
                    </td>
                   
                    <td align="right" style="border-bottom:1px solid #999999;">
                    <p>Actions</p>
                    </td>
                </tr>';
                if (mysqli_num_rows($all_pages) < 1)
                    {
                    $this->html.= '
                    <tr onmouseover="java script:this.bgColor=\'#E6E6E6\';" onmouseout="java script:this.bgColor=\'\';">
                        <td align="left" colspan="6" style="border-bottom:1px solid #CCCCCC;">
                        <p class="nb_red">No pages were found</p>
                        </td>
                    </tr>';
                    }
                while ($page = mysqli_fetch_assoc($all_pages))
                    {
                    $this->html.= '
                    <tr onmouseover="java script:this.bgColor=\'#E6E6E6\';" onmouseout="java script:this.bgColor=\'\';">
                        <td align="left" style="border-bottom:1px solid #CCCCCC;">
                        <p>'.$page['page_id'].'</p>
                        </td>
                       
                        <td align="left" style="border-bottom:1px solid #CCCCCC;">
                        <p>'.$page['page_name'].'</p>
                        </td>
                       
                        <td align="left" style="border-bottom:1px solid #CCCCCC;">
                        <p>'.$page['page_type'].'</p>
                        </td>
                       
                        <td align="right" style="border-bottom:1px solid #CCCCCC;">
                        <p>'.$page['page_status'].'</p>
                        </td>
                       
                        <td align="right" style="border-bottom:1px solid #CCCCCC;">
                        <p>'.$page['page_hits'].'</p>
                        </td>
                       
                        <td align="right" style="border-bottom:1px solid #CCCCCC;">
                        <a href="'.$this->url.'action=edit&id='.$page['page_id'].'">edit</a>
                        <br />
                        <a href="'.$this->url.'action=delete&id='.$page['page_id'].'">delete</a>
                        </td>
                    </tr>';
                    }
                $this->html.= '</table>';
                }
            }
        else
            {
            switch ($_GET["action"])
                {
                case "new":
                    $this->pagetext_new();
                break;
                case "edit":
                    $this->pagetext_edit($_GET["id"]);
                break;
                case "delete":
                    $this->pagetext_delete($_GET["id"]);
                break;
                case "db_create_table":
                    $this->create_db_table();
                break;
                }
            }
        }
    # Create new page
    function pagetext_new()
        {
        if (isset($_POST['save']))
            {
            $name = $_POST['page_name'];
            $type = $_POST['page_type'];
            $status = $_POST['page_status'];
            $content = $_POST['page_content'];
            $keywords = $_POST['page_keywords'];
            $description = $_POST['page_description'];
           
            $errors = array();
           
            if (empty($name))
                {
                $errors[] = 'Enter a name';
                }
            if (empty($type))
                {
                $errors[] = 'Select a type';
                }
            if (empty($status))
                {
                $errors[] = 'Select a status';
                }
            if (empty($content))
                {
                $errors[] = 'Enter some content';
                }
           
            if (sizeof($errors) > 0)
                {
                $nb = '<div class="nb_box_red">
                Correct the following errors:
                <ul>';
                foreach ($errors as $error)
                    {
                    $nb.= '<li>'.$error.'</li>';
                    }
                $nb.= '</ul>
                </div>';
                }
            else
                {
                if (mysqli_query($this->conn, 'insert into '.$this->table.' (page_name,page_type,page_status,page_content,page_keywords,page_description,page_hits) values ("'.$name.'","'.$type.'","'.$status.'","'.$content.'","'.$keywords.'","'.$description.'",0)'))
                    {
                    $nb = '<div class="nb_box_green">
                    The page has been created
                    </div>';
                   
                    unset($name);
                    unset($type);
                    unset($status);
                    unset($content);
                    unset($keywords);
                    unset($description);
                    }
                else
                    {
                    $nb = '<div class="nb_box_orange">
                    An error occured !
                    </div>';
                    }
                }
            }
        if (isset($_POST["cancel"]))
            {
            header('location: '.$this->url.'');
            }
       
        $main_pages = mysqli_query($this->conn, 'select page_name from '.$this->table.' where page_type="Main page"');
        $type_list = '
        <option value="Main page" '.((@$type == 'Main page') ? 'selected="selected"' : '').'>Main page</option>
        <option value="">---------</option>';
        while ($main_page = mysqli_fetch_assoc($main_pages))
            {
            $type_list.= '<option value="Subpage -> '.$main_page["page_name"].'" '.((@$type == 'Subpage -> '.$main_page["page_name"]) ? 'selected="selected"' : '').'>Subpage -> '.$main_page["page_name"].'</option>';
            }
       
        $this->html = '
        <h6>Pagetext - Create</h6>
        <br />
       
        <form method="post" action="'.$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'].'">
        <table width="'.$this->width.'" border="0" cellspacing="0" cellpadding="2">
        <tr>
            <td align="right" colspan="3">
            '.@$nb.'
            </td>
        </tr>
        <tr>
            <td align="left" valign="top">
            <p>Page name</p>
            </td>
           
            <td width="10"></td>
           
            <td align="right" valign="top">
            <input type="text" name="page_name" value="'.@$name.'" class="form_text" />
            </td>
        </tr>
        <tr>
            <td align="left" valign="top">
            <p>Page type</p>
            </td>
           
            <td></td>
           
            <td align="right" valign="top">
            <select size="1" name="page_type"  class="form_select">
                '.$type_list.'
            </select>
            </td>
        </tr>
        <tr>
            <td align="left" valign="top">
            <p>Page status</p>
            </td>
           
            <td></td>
           
            <td align="right" valign="top">
            <p>Active <input type="radio" name="page_status" value="active" '.((@$status == 'active' || !isset($status)) ? 'checked="checked"' : '').' class="form_radio" /></p>
            <p>In-active <input type="radio" name="page_status" value="inactive" '.((@$status == 'inactive') ? 'checked="checked"' : '').' class="form_radio" /></p>
            </td>
        </tr>
        <tr>
            <td align="left" valign="top">
            <p>Page content</p>
            </td>
           
            <td></td>
           
            <td align="right" valign="top">
            <textarea name="page_content" id="editor" class="form_textarea">'.@$content.'</textarea>
            </td>
        </tr>
        <tr>
            <td align="left" valign="top">
            <p>Meta-keywords</p>
            </td>
           
            <td></td>
           
            <td align="right" valign="top">
            <textarea name="page_keywords" class="form_textarea">'.@$keywords.'</textarea>
            </td>
        </tr>
        <tr>
            <td align="left" valign="top">
            <p>Meta-description</p>
            </td>
           
            <td></td>
           
            <td align="right" valign="top">
            <textarea name="page_description" class="form_textarea">'.@$description.'</textarea>
            </td>
        </tr>
        <tr>
            <td align="right" colspan="3">
            <br />
            <button type="submit" name="save" class="form_submit_green"><div class="form_submit_ok">Save</div></button>
            <button type="submit" name="cancel" class="form_submit_red"><div class="form_submit_cancel">Cancel</div></button>
            </td>
        </tr>
        </table>
        </form>';
        }
    # Edit page
    function pagetext_edit($id)
        {
        if (isset($_POST['save']))
            {
            $name = $_POST['page_name'];
            $type = $_POST['page_type'];
            $status = $_POST['page_status'];
            $content = $_POST['page_content'];
            $keywords = $_POST['page_keywords'];
            $description = $_POST['page_description'];
           
            $errors = array();
           
            if (empty($name))
                {
                $errors[] = 'Enter a name';
                }
            if (empty($type))
                {
                $errors[] = 'Select a type';
                }
            if (empty($status))
                {
                $errors[] = 'Select a status';
                }
            if (empty($content))
                {
                $errors[] = 'Enter some content';
                }
           
            if (sizeof($errors) > 0)
                {
                $nb = '<div class="nb_box_red">
                Correct the following errors:
                <ul>';
                foreach ($errors as $error)
                    {
                    $nb.= '<li>'.$error.'</li>';
                    }
                $nb.= '</ul>
                </div>';
                }
            else
                {
                if (mysqli_query($this->conn, 'update '.$this->table.' set page_name="'.$name.'",page_type="'.$type.'",page_status="'.$status.'",page_content="'.$content.'",page_keywords="'.$keywords.'",page_description="'.$description.'" where page_id='.$id.''))
                    {
                    $nb = '<div class="nb_box_green">
                    The page has been edited
                    </div>';
                    }
                else
                    {
                    $nb = '<div class="nb_box_orange">
                    An error occured !
                    </div>';
                    }
                }
            }
        if (isset($_POST["cancel"]))
            {
            header('location: '.$this->url.'');
            }
       
        $old_data = mysqli_query($this->conn, 'select * from '.$this->table.' where page_id='.$id.'');
        $old_data = mysqli_fetch_assoc($old_data);
       
        $main_pages = mysqli_query($this->conn, 'select page_name from '.$this->table.' where page_type="main"');
        $type_list = '
        <option value="Main page" '.(($old_data["page_type"] == 'Main page') ? 'selected="selected"' : '').'>Main page</option>
        <option value="">---------</option>';
        while ($main_page = mysqli_fetch_assoc($main_pages))
            {
            $type_list.= '<option value="Subpage -> '.$main_page["page_name"].'" '.(($old_data["page_type"] == 'Subpage -> '.$main_page["page_name"]) ? 'selected="selected"' : '').'>Subpage -> '.$main_page["page_name"].'</option>';
            }
       
        $this->html = '
        <h6>Pagetext - Edit</h6>
        <br />
       
        <form method="post" action="'.$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'].'">
        <table width="'.$this->width.'" border="0" cellspacing="0" cellpadding="0">
        <tr>
            <td align="right" colspan="3">
            '.@$nb.'
            </td>
        </tr>
        <tr>
            <td align="left" valign="top">
            <p>Page name</p>
            </td>
           
            <td width="10"></td>
           
            <td align="right" valign="top">
            <input type="text" name="page_name" value="'.$old_data["page_name"].'" class="form_text" />
            </td>
        </tr>
        <tr>
            <td align="left" valign="top">
            <p>Page type</p>
            </td>
           
            <td></td>
           
            <td align="right" valign="top">
            <select size="1" name="page_type"  class="form_select">
                '.$type_list.'
            </select>
            </td>
        </tr>
        <tr>
            <td align="left" valign="top">
            <p>Page status</p>
            </td>
           
            <td></td>
           
            <td align="right" valign="top">
            <p>Active <input type="radio" name="page_status" value="active" '.(($old_data["page_status"] == 'active') ? 'checked="checked"' : '').' class="form_radio" /></p>
            <p>In-active <input type="radio" name="page_status" value="inactive" '.(($old_data["page_status"] == 'inactive') ? 'checked="checked"' : '').' class="form_radio" /></p>
            </td>
        </tr>
        <tr>
            <td align="left" valign="top">
            <p>Page content</p>
            </td>
           
            <td></td>
           
            <td align="right" valign="top">
            <textarea name="page_content" id="editor" class="form_textarea">'.$old_data["page_content"].'</textarea>
            </td>
        </tr>
        <tr>
            <td align="left" valign="top">
            <p>Meta-keywords</p>
            </td>
           
            <td></td>
           
            <td align="right" valign="top">
            <textarea name="page_keywords" class="form_textarea">'.$old_data["page_keywords"].'</textarea>
            </td>
        </tr>
        <tr>
            <td align="left" valign="top">
            <p>Meta-description</p>
            </td>
           
            <td></td>
           
            <td align="right" valign="top">
            <textarea name="page_description" class="form_textarea">'.$old_data["page_description"].'</textarea>
            </td>
        </tr>
        <tr>
            <td align="right" colspan="3">
            <br />
            <button type="submit" name="save" class="form_submit_green"><div class="form_submit_ok">Save</div></button>
            <button type="submit" name="cancel" class="form_submit_red"><div class="form_submit_cancel">Cancel</div></button>
            </td>
        </tr>
        </table>
        </form>';
        }
    # Delete page
    function pagetext_delete($id)
        {
        if (isset($_POST['delete']))
            {
            if (mysqli_query($this->conn, 'delete from '.$this->table.' where page_id='.$id.''))
                {
                $nb = '<div class="nb_box_green">
                The page has been delete
                </div>';
                }
            else
                {
                $nb = '<div class="nb_box_orange">
                An error occured !
                </div>';
                }
            }
        if (isset($_POST["cancel"]))
            {
            header('location: '.$this->url.'');
            }
       
        $old_data = mysqli_query($this->conn, 'select * from '.$this->table.' where page_id='.$id.'');
        $old_data = mysqli_fetch_assoc($old_data);
       
        $this->html = '
        <h6>Pagetext - Edit</h6>
        <br />
       
        <form method="post" action="'.$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'].'">
        <table width="'.$this->width.'" border="0" cellspacing="0" cellpadding="2">
        <tr>
            <td align="right" colspan="3">
            '.@$nb.'
            </td>
        </tr>
        <tr>
            <td align="left" valign="top">
            <p>Page name</p>
            </td>
           
            <td width="10"></td>
           
            <td align="right" valign="top">
            <p>'.(($old_data["page_name"]) ? $old_data["page_name"] : '------').'</p>
            </td>
        </tr>
        <tr>
            <td align="left" valign="top">
            <p>Page type</p>
            </td>
           
            <td width="10"></td>
           
            <td align="right" valign="top">
            <p>'.(($old_data["page_type"]) ? $old_data["page_type"] : '------').'</p>
            </td>
        </tr>
        <tr>
            <td align="left" valign="top">
            <p>Page status</p>
            </td>
           
            <td width="10"></td>
           
            <td align="right" valign="top">
            <p>'.(($old_data["page_status"]) ? $old_data["page_status"] : '------').'</p>
            </td>
        </tr>
        <tr>
            <td align="left" valign="top">
            <p>Page hits</p>
            </td>
           
            <td width="10"></td>
           
            <td align="right" valign="top">
            <p>'.((is_numeric($old_data["page_hits"])) ? $old_data["page_hits"] : '------').'</p>
            </td>
        </tr>
        <tr>
            <td align="right" colspan="3">
            <br />
            <button type="submit" name="delete" class="form_submit_green" '.(($old_data["page_name"]) ? '' : 'disabled="disabled"').'><div class="form_submit_ok">Delete</div></button>
            <button type="submit" name="cancel" class="form_submit_red"><div class="form_submit_cancel">Cancel</div></button>
            </td>
        </tr>
        </table>
        </form>';
        }
   
    # Display HTML output
    function display_html()
        {
        echo $this->html;
        }
}

Bruger den således:
<?php
# Include pagetext-class file
include('pagetext.php');

# Make a new instance of the class
$pagetext = new pagetext;
# Connection-string to your database
$pagetext->set_conn(mysqli_connect('localhost','root','1234','classes'));
# Table name for the table to contain the pages
$pagetext->set_table('pagetext');
# URL to the file the system is to run from
$pagetext->set_url('demo.php');
# Width of the table-design
$pagetext->set_width(450);

# Initiate
$pagetext->pagetext_overview();
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Demo - PagetextClass</title>
<link rel="stylesheet" type="text/css" href="../_style/style.css" />
</head>

<body>

<?php
# Display HTML
$pagetext->display_html();
?>

</body>

</html>

Beklager al koden, men jeg bryder mig virkelig ikke selv om at se andre spørgsmål/svar med links til kode et andet sted, som for længst er flyttet/fjernet o.l.

/xicrow
Avatar billede arne_v Ekspert
13. maj 2008 - 03:02 #10
Jeg er ikke glad for al den HTML markup i tekst strenge i koden.

Men her viser mine manglende PHP evner sig - jeg ved faktisk ikke hvordan man "normalt"
løser det problem i PHP.
Avatar billede roenving Novice
13. maj 2008 - 03:29 #11
Tjah, måske nok netop forskellen på, hvordan man agerer i procedural kodning og objekt-orienteret ...

De mange hundrede kodelinjer har jeg absolut ikke kigget igennem, men et hurtigt kig ser ud til at du har implementeret den procedurale kode i klasser, så dit udsagn tidligere, om at det ser ud som om, du bare har sat class{} rundt om ser ud til at holde ...

-- men derfor kan det godt være, at du er på den rette vej, det handler nok om, at du skal strukturere din kode, så den virker, f.eks. så den virker uanset om du bruger en database eller en xml-fil
Avatar billede roenving Novice
13. maj 2008 - 04:32 #12
-- og så blev jeg fanget af Ekspertens 3.30-timeout, så mit indlæg blev nok ikke så læseligt ...

-- teksten gik jo på, at arne_v havde henvist til at du burde kunne lave noget kode, som virkede uanset datakilden, gør den ikke det, har du ikke struktureret dine objekter på en hensigtsmæssig måde ...

Objekter bør som udgangspunkt kunne fungere 'alene', altså være uafhængige af den konkrete kode, der findes rundt oomkring det, så et objekt uden problemer kan flyttes fra den ene kode til den anden, og stadig bevare den essentielle funktionalitet (og helst den fulde, men sådan ser virkeligheden ikke altid ud !-)

-- jeg fik selv nogle gode oplevelser af at arbejde med serialisering for nogle år siden, for der blev strukturen helt tydelig som forudsætning for at opbygge ordentlige klasser og objekter, men det betyder desværre ikke, at det lige kan få dig sporet ind på den rigtige måde at opbygge dit projekt ...

Og det kan tilføjes, at jeg i starten af 90'erne brugte måneder til at opbygge bare en lille forståelse af OOP, for inden da havde jeg kun prøvet diverse Basic-varianter og andre procedurale sprog (f.eks. ALGOL og COBOL), og baggrunden med at udføre en reaktion på konkrete data var bestemt ikke den rette for at forstå programmering i OOP ...

Hvis du kommer uden erfaringer på objekter, ville jeg nok forsøge med at lave et egentligt OOP-projekt (bare noget småt !-), hvor du uden et konkret projekt-mål prøvede at lave nogle sammenhængende strukturer, hvor f.eks. regneopgaver eller sorteringsopgaver blev udført med nogle klasser !o]
Avatar billede mxs Nybegynder
13. maj 2008 - 10:23 #13
Du kunne starte med at lave en simpel klasse, connection. Denne klasse har nogle members, connect, disconnect, set_user, set_password osv. Dens constructor kunne også tage password, username osv. Denne klasse arver du så ned i en connection_MySQL, connection_MS ... Alt hvad du ønsker du at connecte til. Nu kan du så bruge connection klassen i en anden klasse, fx. pagetext. Pagetext, kan så tage enten connnection_MySQL eller connection_MS eller en helt tredje, uden at være bange for hvad den får, for du har implementeret nedarvningerne udfra din base klasse, connect. Pagetext kan nu oprette en forbindelse til mange forskellige klasser uden problemer. Vil du have en connection til en sqlite database, kan du oprette en connection_mysqlite som nedarver fra connection og implementerer forbindelsen på sqlites måde, og derefter bruge den i pagetext. Pagetext har nogle members. get_xml, get_rawtext, get_html ... osv. Hver af disse members kalder nogle andre klasser, fx make_xml, make_rawtext, make_html, som så bruger de data som pagetext har hentet til dem. Pagetext kunne fx være sat sådan op at den hentede en overskrift, en opsummering fra teksten, hele teksten, dato, forfatter osv. Alt sammen pakket ind i et array. Dette array tager dine forskellige make_ objekter så og laver en udskrift på det, som så dine make_ members returnerer.
I mit eksempel har du pakket problemstillingerne ind og giver hvert objekt noget arbejde som du nemt kan genbruge i andre projekter. Forstil dig at du ikke vil hente fra database mere, men heller fra en ftp. Du laver nu en connection_ftp, som arver fra connection, og implementere de nødvendige members (og måske nogle nye [aner ikke hvordan ftp forbindelser foregår i PHP]). Du kan altså blive ved med at lave forskellige og ny klasser som kan proppes ind i din pagetext.
For at gøre det lidt mere brugervenlig, kunne man lave en klasse som styrede output alt efter hvad objekt den fik. Altså noget ala object factory.

Hæng mig ikke op på mit eksempel. Jeg har bare brugt og interesseret mig for OOP i min fritid. Har ingen teknisk baggrund i selve faget andet end at det interessere mig at rode med sådan noget.
Avatar billede rax Praktikant
13. maj 2008 - 10:49 #14
Hey xicrow,

Jeg underviser selv i OOP, og har givet en forklaring på et par nøgleelementer inden for OOP i en anden tråd her på eksperten, http://www.eksperten.dk/spm/828898 .

Det vil jeg anbefale dig at læse :)
Avatar billede xicrow Nybegynder
13. maj 2008 - 15:22 #15
Ok, har prøvet at lave en class til at behandle templates, for at se om jeg har forstået tingende rigtigt, den kommer her:
class template
    {
    # Variables
    private $output;
   
    # Functions
    public function load($path)
        {# Load the contents of a template-file into a variable
        if (file_exists($path))
            {
            $this->output = file_get_contents($path);
            return true;
            }
        else
            {
            echo '<br>File specified doesnt exist!<br>';
            return false;
            }
        }
   
    public function process($search_arr, $replace_arr)
        {# Process (search and replace) the template
        if (!empty($this->output))
            {
            $this->output = str_replace($search_arr, $replace_arr, $this->output);
            return true;
            }
        else
            {
            echo '<br>Please load a file, before processing!<br>';
            return false;
            }
        }
   
    public function display()
        {# Display the finished template
        echo $this->output;
        }
    }

Bruger den således:
include('template.class.php');

$template = new template;
$template->load('template.html');

$search_arr = array(
            '[title]',
            '[body]');
$replace_arr = array(
            'Test af template class',
            '<center><h3>Test</h3></center>');

$template->process($search_arr, $replace_arr);
$template->display();

Den skulle jeg mene er en meget genbrugelig klasse, sålænge det gælder template-filer, og den er lavet "in the spirit of OOP", har jeg ret ?

Derudover så tror jeg ikke helt jeg har forstået det med nedarvning (a extends b) korrekt. Hvis jeg, som mxs skriver, laver en connection class, og derefter f.eks. "connection_mysql extends connection", kan jeg så ved at lave en ny instans af connection_mysql bruge alle funktioner fra connection, som hvis det var den jeg kaldte, men samtidig alle "udvidelserne" fra connection_mysql ?

Eller er det kun inde i klassen connection_mysql, at jeg kan bruge functionerne fra connection ?

/xicrow
Avatar billede rax Praktikant
13. maj 2008 - 15:42 #16
Den måde mxs beskriver, bør connection være et interface, og ikke en klasse.. det vil altså sige, at selve implementeringen af de enkelte metoder udelukkende sker i de klasser, som implementerer interfacet. Hvis connection_mysql f.eks. er en klasse, som implementerer interfacet connection, så kan du ved at instantiere connection_mysql anvende de metoder, som interfacet definerer.
Avatar billede xicrow Nybegynder
13. maj 2008 - 17:01 #17
rax -> du har tabt mig... hvorfor bør "connection" være et interface ? hvad er et interface ? hvad er forskellen på et interface og en class ?

/xicrow
Avatar billede rax Praktikant
14. maj 2008 - 10:11 #18
Hmm, lad mig se om jeg kan forklare det kort:

Et interface er en klasse, hvor samtlige metoder er abstrakte. Det vil sige, at det kun er signaturen for metoden, som er defineret.. ikke selve funktionaliteten. Idet signaturen på en metode angiver metodens navn samt parameterliste (og returværdier i andre sprog, dog ikke for php), kan et interface bruges som 'skabelon' for en række funktionaliteter, som underliggende klasser skal implementere.

Det klassiske eksempel er en connection klasse til et datalag. Interfacet connection definerer de metoder, som kræves for at kommunikere med datalaget. De enkelte klasser, som implementerer interfacet, skal så implementere de enkelte metoder. Eksempel:

interface Connection
{

  function connect($host, $user, $pass, $flags);

  function query($query);

  function fetch_array($result);

  ...
}

Lad os lave en klasse til at forbinde til en MySQL database, som implementerer vores interface:

class Connection_MySQL implements Connection
{

  private $link;

  function __construct()
  {
    ...
  }

  function connect($host, $user, $pass, $flags)
  {
    $this->link = mysql_connect($host, $user, $pass, $flags);
  }

  function query($query)
  {
    return mysql_query($query);
  }

  function fetch_array($result)
  {
    return mysql_fetch_array($result);
  }

  ...

}

En klasse som implementerer et interface, SKAL implementere samtlige nedarvede metoder.

Bemærk, at selve funktionaliteten først kommer i de klasser, som implementerer interfacet. Således kunne man tilsvarende lave en Connection_Oracle eller en Connection_PostgreSQL klasse, som implementerer funktionaliteten for en Oracle og en PostgreSQL database, hhv.

Idéen er så, at når du i din applikation ønsker at skifte fra en MySQL database til en PostgreSQL database, så skal du blot skifte den klasse du anvender ud. Din applikation bruger jo netop metoden query($query), som jo er defineret i samtlige klasser, som implementerer interfacet.. Din applikation vil da fungere uanfægtet hvilken database, du anvender.

Håber det var til at forstå :) Det er ikke nemt at redegøre for OOP på så lidt plads ;)

- Kristian
Avatar billede xicrow Nybegynder
14. maj 2008 - 18:49 #19
Lige umiddelbart vil jeg sige at jeg forstår hvad du mener, og jeg forstår nu hvad et interface er. Jeg kan dog ikke se nogen grund til at bruge det, endnu, men det kommer nok engang ;) (sådan havde jeg det også med klasser i starten).

Jeg opretter nok snart et nyt spørgsmål vedrørende hvordan og hvorledes man får det hele til at hænge sammen i et CM-System, hvor man kan installere/fjerne moduler, templates, osv. Men nu skal der lige øves/terpes lidt i hvad jeg har lært først ;)

Hvis alle vil smide et svar deler jeg lige nogle point ud :)

Og tak for hjælpen, det har skubbet mig LANGT i den rigtige retning

/xicrow
Avatar billede rax Praktikant
14. maj 2008 - 19:29 #20
nøglen i OOP er de enkelte elementers uafhængighed af hinanden :) men du spørger bare løs, så skal vi nok svare i det omfang vi kan :)

og tak for point :)
Avatar billede xicrow Nybegynder
14. maj 2008 - 19:33 #21
Jeg tror lige netop det er det med <q>de enkelte elementers uafhængighed af hinanden</q> jeg vil øve mig på, er vant til bare at smide det hele ind i en store pærevelling (næsten) :P

Venter lige til de andre der ønsker point for deres indsats har afgivet svar, så fordeler jeg pointen.

/xicrow
Avatar billede xicrow Nybegynder
16. maj 2008 - 17:44 #22
arne v, roenving, mxs, er der ingen af jer der ønsker point for jeres hjælp ?
Syntes da i fortjener noget, ellers går det hele rax...

/xicrow
Avatar billede arne_v Ekspert
16. maj 2008 - 18:50 #23
svar
Avatar billede roenving Novice
17. maj 2008 - 12:07 #24
Okay, men smid kun nogle småbidder til mig '-)
Avatar billede roenving Novice
19. maj 2008 - 16:58 #25
Tak for point ;~}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester