webForumDet fria alternativet

OOP i PHP

3 svar · 498 visningar · startad av Cypher

CypherMedlem sedan mars 200622 inlägg
#1

Jag hade tänkt att jag skulle försöka greppa det här med objektorienterad programmering i PHP. jag har nyligen läst en kurs i OOP i ASP.NET så kanske har jag tänket för att även klara detta i PHP.

Jag har en enkel funktion som jag tänkte att jag kunde försöka göra om. Funktionens uppgift är att ta hand om en användaraktivering, och skapa en ny användare om aktiveringsnyckeln stämmer. Men i exemplet lämnar jag ute själva aktiveringsnyckeln och går direkt på Användarregistreringen.

Jag har letat efter en del artiklar på webben men jag har inte hittat sådär jättemycket nyttigt. Har ni några länkar liggande tar jag gärna emot dem.

Så vad jag har nu är två stycken klasser, ett affärslager och ett dataåtkomstlager. Kalla dem User och UserDAL.

Ifrån mitt formulär, efter att in-datat har behandlats och lite annat så kommer jag till User->UserActivasion($username, $password, $email).

Härifrån ska jag då först validera datat på nytt, och sedan skicka vidare objektet till UserDAL om allt validerar för att lägga in datat i databasen.

Så min tanke är ju att på rad 45 i User, skicka med detta objektet med $this(Vet inte om det fungerar så, men kändes på något sätt logiskt) till UserDAL för att senare i UserDAL kunna använda mig av getUsername() för att hämta ut User-objektets username (Rad 10 UserDAL)

<?php class User
{
	# Fält

	private $username;
	private $password;
	private $email;

	# Egenskaper

	public function getUsername()
	{
		return $this->username;
	}
	public function setUsername($username)
	{
		$this->username = $username;
	}

	public function setPassword($password)
	{
		$this->password = $password;
	}

	public function setEmail($email)
	{
		$this->email = $email;
	}

	# Instansmetoder - CRUD

	public function UserActivasion($activasion, $username, $password, $email)
	{
		$this->setUsername($username);
		$this->setUsername($password);
		$this->setUsername($email);
		/*
		 * TODO Validering av data.
		 */

		// Hämta data ifrån DataåtkomstLagret
		$dal = new UserDAL();
		$result = $dal->addUser($this);

	}
}
?>
<?php class UserDAL
{

	public function addUser(User $user)
    {
        global $db_prefix;
		
		$sql = mysql_query("SELECT Username 
							FROM {$db_prefix}user 
							WHERE LOWER(Username)=LOWER($user->getUsername())
							LIMIT 1");
        $count = mysql_num_rows($sql);
		
		if($count == 0) 
		{
		
			$sql = mysql_query("INSERT INTO {$db_prefix}user 
								SET Username=$user->getUsername, Password=$password, Email=$email");
			if(!$sql)
			{
				$error[0] = 'Det skedde ett fel vid skapandet av användaren. Kontakta administratören.';
			}
		}
		else
		{
			$error[0] = 'Användarnamnet du angav är upptaget.';
		}

		// Om $count > 0, returnera true, annars false.
        return (isset($error)) ? $error : true;
    }
}
?>

Är jag helt fel ute när jag gör på detta sätt? För jag får ett antal felmeddelanden på rad 10 i UserDAL som gnäller över $user->getUsername().

Notice: Undefined property: User::$getUsername in ******\dataaccess\UserDAL.class.php on line 10
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in ******\dataaccess\UserDAL.class.php on line 12

DraqirMedlem sedan mars 200921 inlägg
#2

Du har ingen tillgång till

$user->getUsername()

i UserDal, det finns ingen instans av user i UserDAL. Det vill säga, du skapar ingen instans av user genom att använda this pekaren till en klassdefinition och har därför inte tillgång till dess metoder.

vicMedlem sedan apr. 2006244 inlägg
#3

Varför inte låta userDAL::addUser vara en statisk metod? Sen skulle jag hellre kasta olika exceptions än att eventuellt skicka en array med fel men det är väl en smaksak

danjelMedlem sedan juni 200443 inlägg
#4

Jag förstår inte varför UserActivasion tar parametrar..?
Bättre att göra så generellt:

$u = new User();
$u->SetUserName("x");
$u->SetPassword("x");
..

$u->UserActivasion();

...

public function UserActivasion()
{
        // Hämta data ifrån DataåtkomstLagret
        $dal = new UserDAL();
        $result = $dal->addUser($this);

 }

Kanske bättre att skapa ett data mapper objekt för att slippa skicka med hela Userobjektet till DAL klassen..


class UserVO {
    protected $id;
    protected $username;
    protected $password;
    
    public function setId($id) {
        $this->id = $id;
    }
    
    public function getId() {
        return $this->id;
    }
    
    public function setUsername($username) {
        $this->username = $username;
    }
    
    public function getUsername() {
        return $this->username;
    }
    
    public function setPassword($password) {
        $this->password = $password;
    }
    
    public function getPassword() {
        return $this->password;
    }
}

$vo = new UserVO();
$vo->setEmail("");
etc..

$u = new User();
$u->UserActivasion($vo);

...

public function UserActivasion(UserVO $vo)
{
        // Hämta data ifrån DataåtkomstLagret
        $dal = new UserDAL();
        $result = $dal->addUser( $vo);

 }
130 ms totalt · 3 externa anrop · v20260731065814-full.0e50b1ef
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)