Abstract class i PHP

Her til aften/nat sad jeg og tænkte efter jeg havde lavet lidt arbjede om at der enligt nok var nået jeg kunne forbedre mig på, her til tænkte jeg at jeg enligt ikke rigtig havde styr på abstract i php og class, derfor valgte jeg så at læse lidt om dette som så resutert i at det enligt ikke være så svært som jeg først havde gået og tordet.

jeg har lavet et lille eks. så i der ude også kan få lidt gavn af dette og se hvad abstract enligt gør.

<?php
abstract class AbstractCls
{
    protected $code = true;

    public function returnError()
    {
        if ( $this->code === false )
        {
            return 'fail';
        }
        elseif ( $this->code === true )
        {
            return 'ok';
        }
        else
        {
            return 'n/a';
        }
    }
}

class test extends AbstractCls
{
    public function valiUser( $username )
    {
        if ( $username == '' )
            $this->code = false;

        echo $this->returnError();
    }
}
?>

Jeg har naturligvis også testet det så det fungere, det jeg har gjort er at lave en fil med følgene linjer i.

<?php
include( 'test.class.php' );
$test = new test();

$test->valiUser( 'neonman' );
?>

Håber dette eksemple kan bruge stil nået, det har hjulpet mig til at forstå det nået bedre omkring abstract inden for class.

8 comments

  1. Simon Jensen says:

    Nu du er ved at arbejde med god skik og forbedringer, så vil jeg stærkt anbefalde dig at bruger return i stedet for echo i dine klasse-metoder.

  2. NeoNmaN says:

    Tak dude, havde jeg ik lige tænkt på i det jeg lavede det men ja det er ganske rigtig burdte jeg ha gjort :)

  3. Der er ikke så meget ved din abtract class, hvis du ikke har nogle methods i den som skal overrides. Dit eksempel er bare helt almindeligt nedavning.

    Abstraction er mest brugbart hvis du bruger polymorphism og derfor har brug for at de forskellige objekter følger et regelsæt.

  4. NeoNmaN says:

    Hmmm, kan du ud dybe det lidt? :) ved ik helt hvad polymorphism er nermlig. :)

  5. Her er et lille eksempel på hvordan det kunne bruges til validators, som kan køres på samme måde selvom det er forskellige classes: http://pastie.textmate.org/574724 (smækket sammen her lidt over midnat, så der kan godt være lidt småfejl i det ;) )

  6. christian says:

    Lasses eksempel er måske lidt overkill. Ihvertfald burde run validators måske være en del af den overordnet validator klasse. Så kunne man gøre noget i stil med Validator::isValid($string, array(new Email(), new StrLength(5, 10)))

    Abstrakte klasser kan bruges som et overordnet sæt af metoder som er gældende for alle klasser under den abstrakte. Nu du er igang, kunne du også kigge på interfaces som gir dig et reglsæt for hvilke metoder en klasse skal indeholde.

    Og til sidst burde du bruge PEAR navne givning til dine klasser. Det går i bund og grund ud på at bruge din mappe struktur som klasse navn.

    Abstract class App_ValidatorAbstract {}
    class App_Validator_Email extends App_ValidatorAbstract {}
    class App_Validator_StrLength extends App_ValidatorAbstract {}

    Dette ville blive til:
    App:
    -Validator.php
    -Validator:
    –ValidatorAbstract.php
    –ValidatorEmail.php
    –ValidatorStrLength.php

    -Det gør det nemmere at håndtere og strukturere din kode. Men også autoloading blir MEGET nemmere!

    Held og lykke

  7. christian says:

    hov, den fjernede min struktur

    App:
    -Validator.php
    -Validator:
    --Abstract.php
    --Email.php
    --StrLength.php

    - sådan burde det være!

  8. NeoNmaN says:

    Hej Christian, jeg takker mange gange, :) det vil jeg prøve at arbjede lidt med.

Leave a Reply

Your email address will not be published. Required fields are marked *

*