WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   PHP getters i klasser, funkar det? (https://www.wn.se/forum/showthread.php?t=1054260)

goose 2012-07-28 22:24

Citat:

Ursprungligen postat av Ishra (Inlägg 20445809)

Hämta egenskaper som inte finns, det går väl aldrig (dom finns ju inte?), och ifall man sätter en egenskap som inte finns egentligen så gör väl inte det så mycket?
Håller med om att är "lite fult" såklart att kunna sätta egenskaper som inte finns egentligen, men klassen borde ju inte fråga efter den egenskapen ändå så borde inte påverka något, eller missar jag något?

handlar väl om att det kan bli en bugg om man råkar stava en property fel av misstag. i ett kontrollerande språk får man ett felmeddelande direkt av kompilatorn, men i php så skapas en ny property med en felstavad property och man måste jaga buggen.

Nerix 2012-07-29 11:38

Citat:

Ursprungligen postat av goose (Inlägg 20445864)
handlar väl om att det kan bli en bugg om man råkar stava en property fel av misstag. i ett kontrollerande språk får man ett felmeddelande direkt av kompilatorn, men i php så skapas en ny property med en felstavad property och man måste jaga buggen.

Ja, eller så ser man till och skriva ordentliga tester enligt BDD eller TDD.

goose 2012-07-30 00:57

Jobbigt att skriva enhetstester för att täcka upp enkla slarvfel som kompilatorn snappar upp direkt tycker jag, därför jag håller mig till c# istället för php. Php har säkert en del styrkor och man ska nog inte försöka förändra dess natur genom att försöka få den att emulera ett mer strikt språk som Conny verkar vilja göra här.

Nerix 2012-07-30 01:59

Citat:

Ursprungligen postat av goose (Inlägg 20445933)
Jobbigt att skriva enhetstester för att täcka upp enkla slarvfel som kompilatorn snappar upp direkt tycker jag, därför jag håller mig till c# istället för php. Php har säkert en del styrkor och man ska nog inte försöka förändra dess natur genom att försöka få den att emulera ett mer strikt språk som Conny verkar vilja göra här.

Tror inte riktigt jag hänger med. Hur skulle en kompilator se att du använt fel metodnamn? Jag menar, du skriver ett test som gör det möjligt att te.x skriva och läsa ett namn-attribut i en user-klass. Skulle du stava fel här så finns det ingen kompilator som säger till.

Kompilatorn fångar, av egen erfarenhet, upp fel som nybörjare ofta begår; syntax fel. Erfarna utvecklare missar sällan semikolon eller har ett mellanslag på fel ställe. Vi gör istället logiska fel, fel som inte en kompilator kan hitta.

Conny Westh 2012-07-31 02:42

Citat:

Ursprungligen postat av orreborre (Inlägg 20445659)
Ja, du missuppfattade vad jag menade.
Jag menade att det känns som en dålig lösning att ha en switch-/if-sats i __get och __set.
Min lösning visar ett sätt att slippa det.

Jag är alltså ute efter ett sätt att skapa getters och setters så man kan ha individuell kod fölr varje property, det är inte ett sätt att skriva mer krånglig kod. I andra programspråk somexempelvis C#, men även Visual Objects, VB.NET så kan man använda pegreppet "property" för att definiera en ndividuellt utformat kod, det är lite dte jag är ute efter. Men det gick inte att deklarera mer än en __get och en __set -metod per klass

Helst skulle jag önska att man kan deklarera:


public class Person
{
// declataion of private variables
private _firstname="";
private _lastname="";

// Jag skippar konstruktorn i detta exempel....

public __set_firstname($value)
{
$this->_firstname = $value;
}

public __get_firstname()
{
return $this->_firstname;
}


public __set_lastname($value)
{
$this->_lastname = $value;
}

public __get_lastname()
{
return $this->_lastname;
}

// Jag skippar även ToString-metoden....

}

När man sen accessar egenskapen så vill jag göra så här:


private $kalle = new Person();

$kalle.firstname = "Kalle";
$kalle.lastname = "Pettersson";

echo $kalle.firstname . " " . $kalle.lastname

Resultatet ska då bli:

"Kalle Pettersson"

OBSERVERA att det inte alls är samma sak som att ha en funktion som geter getFirstName och en funktion som heter setFirstName, det är INTE getters och setters.... Ni som har jobbat med andra objektorienterade språk vet nog vad jag menar...


.
.
.

Conny Westh 2012-07-31 02:52

Citat:

Ursprungligen postat av Jake.Nu (Inlägg 20445720)
Dummaste jag sett på länge.. Antingen kan du språket/vet vad du gör (oavsett programspråk) eller så kan/vet du inte.. Vad är det för mening med att sätta 200 parametrar som ändå inte används?

PHP-kod:

// styrkan i PHP:
$x = new StdClass();
$x->pelle "ett namn";

// bara dumt!
eval($x->jagtrorjaghittarpanagotsomkanskeintefinnsmendetfunkarsakerteftersomphparjusakassochkontrollavindataharjusakertintemeddettaattgora); 

??

Bygga in skydd/lager-på-lager-på-lager-på-lager mot klantskallar kan ju Java/.NET fortsätta hålla på med tills dom avlider..

Förväntar du dig ett viss datatyp när du sätter en property så får du väl kolla efter det istället? Inte bara om den ens finns "definierad" i klassen.

Du visar ju prov på att inte förstå programmeringens grunder över huvud taget, så dina kommentarer behöver ingen ens fundera på.

Om du inte begriper objektorienterad programmering så bör du inte komma med fullkomligt idiotiska inlägg här i forumet.

Conny Westh 2012-07-31 03:00

Citat:

Ursprungligen postat av orreborre (Inlägg 20445739)
Fast det beror ju på vad målet med det hela är.
Som jag uppfattade det var målet att det inte ska gå att sättaegenskaper som objektet inte redan har. Alla som finns ska kunna sättas/hämtas.

Det var ett av målet, just pga brister i php, men den huvudsakliga anledningen är att ha getters och setters som man kan sätta i andra objektorienterade språk.

Dvs exempelvis som i C# där man kan ha en metod för att validera värden när de sätts till en metod, 'är värdet utan för det giltigas gräns så kan man endera låta bli att lagra värdet i klassen eller göra en Throw Exception("Med ett vettigt felmeddelande")....

När man läser av ett värde så kan man exempelvis ha en automatisk konvertering, formatering, lagring av accessstatistik eller inläsning från någon extern källa. detta utan att programmeraren som använder egenskapen behöver bekymra sig över hur det går till.

Conny Westh 2012-07-31 03:15

Citat:

Ursprungligen postat av Nerix (Inlägg 20445939)
Tror inte riktigt jag hänger med. Hur skulle en kompilator se att du använt fel metodnamn? Jag menar, du skriver ett test som gör det möjligt att te.x skriva och läsa ett namn-attribut i en user-klass. Skulle du stava fel här så finns det ingen kompilator som säger till.

Kompilatorn fångar, av egen erfarenhet, upp fel som nybörjare ofta begår; syntax fel. Erfarna utvecklare missar sällan semikolon eller har ett mellanslag på fel ställe. Vi gör istället logiska fel, fel som inte en kompilator kan hitta.

Nej du har inte insett vad en kompilator gör.

Kompilatorn fångar upp just stavfel eftersom den upptäcker att du inte deklarerat den felstavade variabeln och du får ett felmeddelande som talar om exakt vilken variabel, konstant funktion, klass eller annan identifierare som du stavat fel på samt exakt vilken rad och kolumn där felet börjar.

Kompilatorn hittar många enkla fel och underlättar programmerarens arbete enormt på den punkten.

Några saker som kompilatorn gör enträget:

- Kollar syntax
- Kollar att alla variabler som används i programmet är deklarerade
- Kollar att alla variabler som är deklarerade används, annars får man en varning
- Kollar att alla uttryck som tilldelar en variabel har rätt datatyp (dvs den deklarerade datatypen)
- Kollar att alla satser i programmet är avslutade
- kollar att alla kodblock är definierade med start och slut
- Kollar att identifierarnas scope stämmer
.
.
.

Kompilatorn är programmerarens bästa vän...

Jag har mycket svårt att acceptera att det fortfarande finns programspråk som saknar kompilator....

De som ligger bakom php har tydligen fått en hel del önskemål från mer erfarna utvecklare om att tighta tillk språket så man får ett något bättre stöd för typning och deklarationer, men jag tycker de hittils gjort det lite till en halvmesyr.

Mitt försök är till för att försöka lära mig om det finns möjligheer att strama till språket för att få bättre felhantering redan innan koden tas i produktion.

Conny Westh 2012-07-31 05:47

Så här skulle motsvarande program se ut i C# med de metoder och properties jag var ute efter:

Kod:

using System;
using System.Collections.Generic;

namespace Test
{
        public class Person
        {
                private string _FirstName = "";
                public string FirstName
                {
                        get { return _FirstName; }
                        set { _FirstName = value; }
                }

                private string _LastName = "";
                public string LastName
                {
                        get { return _LastName; }
                        set { _LastName = value; }
                }

                public Person(string FirstName, string LastName)
                {
                        this.FirstName = FirstName;
                        this.LastName = LastName;
                }

                public override string ToString()
                {
                        return String.Format("{0} {1}",this.FirstName, this.LastName);
                }
        }
}

Kod:

using System;
using System.Collections.Generic;


namespace Test
{
        class PersonAge : Person
        {
                private int _BirthYear;

                public int BirthYear
                {
                        get { return _BirthYear; }
                        set { _BirthYear = value; }
                }

                public int Age
                {
                        get
                        {
                                return (2012 - BirthYear);
                        }
                }

                public PersonAge(string FirstName, string LastName, int BirthYear)
                        : base(FirstName, LastName)
                {
                        this.BirthYear = BirthYear;
                }

                public override string ToString()
                {
                        return String.Format("{0} ({1} år)", base.ToString(), this.Age);
                }
        }
}

Kod:

using System;
using System.Collections.Generic;


namespace Test
{
        class Program
        {
                static void Main(string[] args)
                {

                        List<Person> personer = new List<Person>();

                        personer.Add(new Person("Fredrik", "Framberg"));
                        personer.Add(new Person("Greta", "Gavelstam"));
                        personer.Add(new Person("Urban", "Urberg"));
                        personer.Add(new Person("Anna", "Ambtesteg"));

                        Console.WriteLine("Visa alla Person i personer...");
                        foreach (Person person in personer)
                        {
                                Console.WriteLine(person);
                        }

                        List<PersonAge> personAges = new List<PersonAge>();
                        personAges.Add(new PersonAge("Henrik", "Hammarberg", 1956));
                        personAges.Add(new PersonAge("Kristina", "Karlestam", 1983));
                        personAges.Add(new PersonAge("Hans", "Hallin", 1967));
                        personAges.Add(new PersonAge("Berit", "Bygdén", 1974));

                        Console.WriteLine();
                        Console.WriteLine("Visa alla PersonAge i personAges...");
                        foreach (PersonAge person in personAges)
                        {
                                Console.WriteLine(person);
                        }

                        Console.WriteLine();
                        Console.WriteLine("Kopiera alla PersonAge till personer...");
                        foreach (Person person in personAges)
                        {
                                personer.Add(person);
                        }

                        Console.WriteLine();
                        Console.WriteLine("Visa alla Person och PersonAge i personer...");
                        foreach (Person person in personer)
                        {
                                Console.WriteLine(person);
                        }

                        Console.ReadKey();
                }
        }
}

Kod:

Visa alla Person i personer...
Fredrik Framberg
Greta Gavelstam
Urban Urberg
Anna Ambtesteg

Visa alla PersonAge i personAges...
Henrik Hammarberg (56 år)
Kristina Karlestam (29 år)
Hans Hallin (45 år)
Berit Bygdén (38 år)

Kopiera alla PersonAge till personer...

Visa alla Person och PersonAge i personer...
Fredrik Framberg
Greta Gavelstam
Urban Urberg
Anna Ambtesteg
Henrik Hammarberg (56 år)
Kristina Karlestam (29 år)
Hans Hallin (45 år)
Berit Bygdén (38 år)


Conny Westh 2012-07-31 06:32

Efter att ha testkört koden under Ubuntu 12.04 med mono-mcs (en C# clone i Linux-miljön) så kan jag konstatera att resultatet av testkörningen blev identiskt med Windows 7.

Jag bifogar Makefile för den som vill testa:

Kod:

#################################################################
# File: Makefile
# Author: Conny Westh, 2012
#################################################################
# This is a sample program in C#, works perfect in both Windows 7
# with Visual Studio 2010 and in ubuntu 12.04 with mono-mcs
# Command: sudo apt-get install mono-mcs
# to optain the C# compiler needed in ubuntu.
# This sample code demonstrates inheritance, property get and set
# override of method ToString(), Polymorphism, calculated read only
# property...
#################################################################
person : Program.cs Person.cs PersonAge.cs
        mcs -out:person Program.cs Person.cs PersonAge.cs
        @chmod 777 person

.PHONY : clean
clean :
        @rm -f person *.??~ Makefile~



Alla tider är GMT +2. Klockan är nu 18:49.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson