Kom ihåg mig?
Home Menu

Menu


PHP getters i klasser, funkar det?

 
Ämnesverktyg Visningsalternativ
Oläst 2012-07-28, 22:24 #21
gooses avatar
goose goose är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2007
Inlägg: 451
goose goose är inte uppkopplad
Flitig postare
gooses avatar
 
Reg.datum: Jun 2007
Inlägg: 451
Citat:
Ursprungligen postat av Ishra Visa inlägg

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.
goose är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-07-29, 11:38 #22
Nerix Nerix är inte uppkopplad
Flitig postare
 
Reg.datum: Oct 2010
Inlägg: 398
Nerix Nerix är inte uppkopplad
Flitig postare
 
Reg.datum: Oct 2010
Inlägg: 398
Citat:
Ursprungligen postat av goose Visa inlägg
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.
Nerix är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-07-30, 00:57 #23
gooses avatar
goose goose är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2007
Inlägg: 451
goose goose är inte uppkopplad
Flitig postare
gooses avatar
 
Reg.datum: Jun 2007
Inlägg: 451
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.
goose är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-07-30, 01:59 #24
Nerix Nerix är inte uppkopplad
Flitig postare
 
Reg.datum: Oct 2010
Inlägg: 398
Nerix Nerix är inte uppkopplad
Flitig postare
 
Reg.datum: Oct 2010
Inlägg: 398
Citat:
Ursprungligen postat av goose Visa inlägg
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.
Nerix är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-07-31, 02:42 #25
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Citat:
Ursprungligen postat av orreborre Visa inlägg
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...


.
.
.

Senast redigerad av Conny Westh den 2012-07-31 klockan 02:46
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-07-31, 02:52 #26
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Citat:
Ursprungligen postat av Jake.Nu Visa inlägg
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 är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-07-31, 03:00 #27
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Citat:
Ursprungligen postat av orreborre Visa inlägg
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 är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-07-31, 03:15 #28
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Citat:
Ursprungligen postat av Nerix Visa inlägg
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.

Senast redigerad av Conny Westh den 2012-07-31 klockan 03:22
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-07-31, 05:47 #29
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
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)

Senast redigerad av Conny Westh den 2012-07-31 klockan 05:53
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-07-31, 06:32 #30
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
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~

Senast redigerad av Conny Westh den 2012-07-31 klockan 06:35
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 19:19.

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