Avatar billede RippieUK Nybegynder
11. marts 2010 - 09:25 Der er 19 kommentarer og
2 løsninger

PHP OOP har jeg forstået det korrekt ??

Hej,

Skal lige høre nogle af jer PHP guru'er derude om PHP OOP og om jeg har forstået det rigtigt.

Hvis vi har flg filer class.lib.php og side1.php har jeg forstået det rigtigt at du bygger din classes og methods i class.lib.php og på side1.php kalder jeg så den class og de methods jeg vil have vist på den side ?

side1.php:
$myObject = new myObject();

$myObject->createHeader();
$myObject->createContent();
$myObject->createFooter();

class.lib.php:

class myObject {
  function createHeader() {
  something
  }

  function createContent() {
  something
  }

  function createFooter() {
  something
  }

}

Er det omkring rigtigt ?
Avatar billede repox Seniormester
11. marts 2010 - 09:32 #1
Ja, det ser meget rigtigt ud.
Avatar billede drlotto Nybegynder
11. marts 2010 - 09:58 #2
Hvis jeg var dig, og lige startet på OOP, så ville jeg os tage et kig på MVC Framework, det kan gøre din dagligdag meget meget nemmere :)

lidt info:
http://en.wikipedia.org/wiki/Model-view-controller
Avatar billede repox Seniormester
11. marts 2010 - 10:01 #3
#2
Det var en voldsom anbefaling til en som lige er startet på OOP?
At kunne anvende et MVC forudsætter vel at man kan forstå det grundlæggende i OOP hvad angår nedarvning og polymorfi?
Avatar billede RippieUK Nybegynder
11. marts 2010 - 11:21 #4
Ville jeg have HTML code i min class.lib.php fil ? ikke HTML, HEAD og BODY tags... men DIV's og TABEL's etc ? så jeg ender op med have alt min kode i den class fil `? og så have HTML HEAD BODY i min side1.php ?
Avatar billede repox Seniormester
11. marts 2010 - 11:30 #5
Det ville være tåbeligt; det er ikke noget der afspejler hvad OOP er til - men ja, du kan sagtens.

Ved at gøre det på den måde, vil du egentlig bare komme ud på et plan hvor du bliver ved med at lave flere og flere metoder i din klasse, for at få mere og mere HTML output der lige passer specielt til den og den lejlighed. Så kunne du lige så godt bare have det i almindelige funktioner - altså, du får ikke noget ud af at have det i en klasse. Klassen er bare en indkapsling af dine funktioner, så.
Avatar billede RippieUK Nybegynder
11. marts 2010 - 12:43 #6
Så hvis jeg forstår dig korrekt.

side1.php vil indholde din HTML code og når du skal bruge noget data kan du gøre det inde i class.lib.php og så bruge det på side1.php ?

Vil du have noget imod at have en OOP snak en af dagene ? eller vil helst have vi snakker her ?
Avatar billede repox Seniormester
11. marts 2010 - 13:18 #7
Mjaeh, det er en lidt løs beskrivelse du selv laver - lidt uddybelse havde været rart.

Udgangspunktet bør være at side1.php er ansvarlig for output; det være sig HTML, tekst og så videre.

class.lib.php bør indeholde/behandle data som du vil anvende i på side1.php. Klassens metoder bør ikke udskrive indhold, men blot returnere data (strenge, tal, bools) som side1.php kan behandle.

side1.php
<?php
  include("inc/config.php");
  include("obj/class.lib.php");

  $myObject = new myObject();

  $articles = $myObject->getTopArticles(5);

?>
<!DOCTYPE...>
<html>
  <head>
  <title>...
  </head>
  <body>

    <div class="newsBox">
      <?php foreach($articles as $article): ?>
        <h3><?php $article["headline"]; ?></h3>
        <p>
          <?php echo $article["teaser"]; ?>
          <br />
          <a href="articles.php?articleId=<?php echo $article["articleId"]; ?>" class="readMore">Læs mere</a>
        </p>
      <?php endforeach; ?>
    </div>
    ...
  </body>
</html>


Alternativt kan du pakke den generiske HTML kode ind i nogle andre filer og inkludere dem istedet.

side1.php (generisk)
<?php
  include("inc/config.php");
  include("obj/class.lib.php");

  $myObject = new myObject();

  $articles = $myObject->getTopArticles(5);

?>
<?php include("inc/html_start.php");

    <div class="newsBox">
      <?php foreach($articles as $article): ?>
        <h3><?php $article["headline"]; ?></h3>
        <p>
          <?php echo $article["teaser"]; ?>
          <br />
          <a href="articles.php?articleId=<?php echo $article["articleId"]; ?>" class="readMore">Læs mere</a>
        </p>
      <?php endforeach; ?>
    </div>
    ...
<?php include("inc/html_end.php"); ?>


og class.lib.php
<?php

  class myObject
  {
    private $db;

    public function __construct()
    {
      // instans af et databaseabstraktionslag
      // ikke vigtigt lige nu, bare for at indikere at jeg
      // åbner en forbindelse til databasen
      $this->db = factory::instance("Database.Mysqli");
    }

    public function getTopArticles( $limit = 3 )
    {
      $sql = "SELECT articleId, headline, teaser FROM articles ORDER BY date DESC LIMIT ".$limit;
      $this->db->query($sql);
      return $this->db->result2array();
    }
   
    ...
  }

?>


For trådens og forummets skyld, finder jeg det mere passende hvis snakken fortsætter her.
Avatar billede RippieUK Nybegynder
11. marts 2010 - 23:04 #8
Kan godt se at jeg bruger OOP helt forkert så. tror jeg vil læse mere op på det og indtil videre bare lave procedural php indtil jeg kan nok OOP.. Kan se det er vejen frem og jeg vil ivrigt læse op på det :)

Du har været super til at hjælpe !!

Jeg vil lige tænke lidt over det her i nat og imorgen og skrive noget mere derefter :)
Avatar billede RippieUK Nybegynder
17. marts 2010 - 00:32 #9
Hej igen.

Sidder lige og kigger på lidt OOP, og øver mig lige med en menu, og skal lige høre kan jeg ikke i min class.lib.php have en method der kalder en SQL og så i min page.php have while($row = mysql_fetch_array($query)) { ? Eller bliver jeg nødt til at smide det ind i en array ?
Avatar billede repox Seniormester
17. marts 2010 - 09:01 #10
Jo, det er der for så vidt ingenting i vejen for - men...

Forestil dig at du har det setup som du selv beskriver.

class.lib.php
<?php

  class myObject
  {
    public function myMethod()
    {
      $sql = "SELECT * FROM pages";
      $res = mysql_query($sql);
      return $res;
    }
  }

?>


page.php
<?php

  $myObject = new myObject();
  $pages = $myObject->myMethod();

  while( $row = mysql_fetch_array($pages) )
  {
    // ...
  }

?>


I tilfælde af at jeg hellere ville arbejde med en anden database (PostgreSQL eksempelvis) ville jeg nu have to filer jeg skal rette i for at få det til at virke.

Derimod kan jeg faktisk nøjes med at tilpasse en enkelt fil, hvvis jeg klarer alt det database relaterede i samme fil:

class.lib.php
<?php

  class myObject
  {
    public function myMethod()
    {
      $sql = "SELECT * FROM pages";
      $res = mysql_query($sql);
      return $this->result2array($res);

    }

    private function result2array( $mysqlResult )
    {
      $tmpArray = array();
      while( $row = mysql_fetch_array($mysqlResult) )
        $tmpArray[] = $row;

      return $tmpArray;
    }

   

  }

?>


page.php
<?php

  $myObject = new myObject();
  $pages = $myObject->myMethod();

  foreach( $pages as $page )
  {
    // ...
  }

?>


Jeg kan nu hurtigt konvertere min klasse til at kommunikere med en PostgreSQL database i stedet.
class.lib.php
<?php

  class myObject
  {
    public function myMethod()
    {
      $sql = "SELECT * FROM pages";
      $res = pg_query($this->conn, $sql);
      return $this->result2array($res);

    }

    private function result2array( $mysqlResult )
    {
      $tmpArray = array();
      while( $row = pg_fetch_array($mysqlResult) )
        $tmpArray[] = $row;

      return $tmpArray;
    }

   

  }

?>


Simpelt, hurtigt og effektivt
Avatar billede RippieUK Nybegynder
17. marts 2010 - 09:20 #11
Tusinde tak... må jeg lige høre dig om 2 ting.

1. jeg går ud fra på din page.php do connecter op til MYSQL som normalt ? og kan bruge den connection i din class.lib.php ?

jeg læser fint din kode, men undre mig hvordan du får $mysqlResult fra ?
Avatar billede repox Seniormester
17. marts 2010 - 09:37 #12
Som jeg viste dig i #7, så har jeg et databaseabstraktionslag tilnkyttet.
I dit tilfælde ville det dog nok være lige voldsomt nok at begynde på, når du ikke har mere styr på OOP end du har, så fremgangsmåden må være lidt mere simpel:

page.php
<?php
  include("inc/config.inc.php"); // Indeholder bl.a. MySQL forbindelsesoplysninger
  include("lib/class.lib.php");

  $myObject = new myObject();
  $pages = $myObject->myMethod();

?>
<html>
  <head>
  ... præcis som vi gjorde før.
  </body>
</html><


class.lib.php
<?php

  class myObject
  {
    private $db;

    public function __construct()
    {
      // Anvender her konstanter defineret i config.inc.php
      $this->db = mysql_connect(DB_HOST, DB_USER, DB_PASS);
      mysql_select_db(DB_BASE, $this->db);
    }

    public function myMethod()
    {
      $sql = "SELECT * FROM pages";
      $res = mysql_query($sql, $this->db);
      return $this->result2array($res);

    }

    private function result2array( $mysqlResult )
    {
      $tmpArray = array();
      while( $row = mysql_fetch_array($mysqlResult) )
        $tmpArray[] = $row;

      return $tmpArray;
    }

   

  }

?>


$mysqlResult er jo bare en variabel jeg har navngivet ud fra den første parameter i min funktion? En funktions parametre kan du jo navngive som du vil?
Avatar billede RippieUK Nybegynder
17. marts 2010 - 17:22 #13
Hvad gør jeg forkert her:

class.lib.php:
class skillMatrix {

    public function createNavi() {
        $links = array(
        'Home' => 'index.php',
        'About' => 'about_us.php',
        'Contact' => 'contact.php'
        );
    }

}

index.php:
require_once 'includes/class.lib.php';    // contain my object methods
$skillMatrix = new skillMatrix();
$skillMatrix->createNavi();

  foreach ($links as $key => $value) {
  echo "<a href=\"$value\">$key</a>";
    }

It gives this error:
Warning: Invalid argument supplied for foreach() in /customers/rippie.dk/rippie.dk/httpd.www/new/skillsmatrix/index.php on line 44

Line 44 on index.php is:
foreach ($links as $key => $value) {

Any ideas ?

Ronnie
Avatar billede Slettet bruger
17. marts 2010 - 22:26 #14
$links fra funktionen createNavi() kan KUN tilgås inde i klassen og derfor kan din foreach($links ...) ikke finde ud hovede og hale i hvad det er du vil have den til.

Du kan vælge at returnerer $links fra funktionen og på den måde gemme $links i en variabel uden for klassen på følgende måde: $links = $skillMatrix->createNavi();
Avatar billede Slettet bruger
17. marts 2010 - 22:27 #15
Rettelse til mig selv: $links fra funkionen createNavi() kan KUN tilgås fra funktionen createNavi() og ikke fra hele klassen skillMatrix
Avatar billede RippieUK Nybegynder
18. marts 2010 - 06:32 #16
Ja det kan jeg godt se. Det jeg ville prøve var ikke at have mine links til min menu inde i en mysql, men i stedet smide dem ind i en array inde i class.lib.php og bruge den function/method fra de andre sider.

Kan i hjælpe mig med en løsning ?
Avatar billede Slettet bruger
18. marts 2010 - 14:06 #17
Som sagt kan du vælge at returnerer dit $links-array fra createNavi() sådan her:

class skillMatrix {

    public function createNavi() {
        $links = array(
        'Home' => 'index.php',
        'About' => 'about_us.php',
        'Contact' => 'contact.php'
        );
        return $links;
    }

}

Nu kan du så angive en variable til skillMatrix::createNavi() sådan her:
$skillMatrix = new skillMatrix();
$links = $skillMatrix->createNavi();


og så burde din foreach-loop virke.
Avatar billede RippieUK Nybegynder
18. marts 2010 - 16:51 #18
Virker jo perfekt !!!! Tusinde tusinde tak.

Kan i begge smide et svar så jeg kan give jer begge point?

Vil meget gerne høre jer om en ting mere, hvis i vil have et nyt spørgsmål oprettet er det ok. I roxki sidste example, er der en måde hvor jeg HIGHLIGHT det menu punkt jeg sidst har klikket på ? så mine brugere ved hvor de er?
Avatar billede Slettet bruger
18. marts 2010 - 18:54 #19
Var så lidt :-)

Ang. dit spørgsmål om highlight af den side man er på, kan det godt ordnes, men det er noget du skal gøre i dit foreach-loop alt efter hvilken side man er på, som du kan finde via $_SERVER["SCRIPT_NAME"]
Avatar billede Slettet bruger
18. marts 2010 - 18:54 #20
og her får du et svar.
Avatar billede repox Seniormester
19. marts 2010 - 10:04 #21
Og her var et fra mig
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
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

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