← Назад к вопросам

На что влияют модификаторы области видимости?

1.0 Junior🔥 251 комментариев
#PHP Core#ООП

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Access Modifiers - public, private, protected

Access modifiers kontrolisuju gde se metode i svojstva mogu pristupiti. Ovo je fundamentalno za enkapsulaciju i kontrolu pristupa.

Tri tipa modifikatora

public - dostupno svuda

public function getName(): string {
    return $this->name;
}

$user = new User();
echo $user->getName(); // OK

private - samo unutar klase

private function hashPassword(string $pwd): string {
    return hash('sha256', $pwd);
}

$user = new User();
$user->hashPassword('test'); // ERROR - private

protected - u klasi i nasleđenim klasama

protected function log(string $msg): void {
    echo $msg;
}

class Admin extends User {
    public function action() {
        $this->log('admin action'); // OK - protected dostupan
    }
}

Na sta utiču modifikatori?

1. Enkapsulacija - Sakrivanje detalja

Privatna svojstva sprečavaju direktnu manipulaciju:

class BankAccount {
    private float $balance = 0.0;
    
    public function withdraw(float $amount): bool {
        if ($amount > $this->balance) {
            return false; // Validacija
        }
        $this->balance -= $amount;
        return true;
    }
}

$account = new BankAccount();
$account->balance = -1000; // ERROR - ne moze se direktno promeniti

2. Kontrola pristupa

Javne metode predstavljaju kontrolisani interfejs:

class Database {
    private PDO $connection;
    
    private function connect(): void {
        $this->connection = new PDO('...');
    }
    
    public function query(string $sql): array {
        return $this->connection->query($sql)->fetchAll();
    }
}

3. Sigurnost

Sakrivanje osjetljivih podataka:

class PaymentProcessor {
    private string $apiKey = 'secret_key_123';
    
    private function makeRequest(string $endpoint): array {
        return curl_request($this->apiKey, $endpoint);
    }
    
    public function charge(Money $amount): bool {
        return $this->makeRequest('/charge');
    }
}

// Nema pristupa $apiKey
$proc = new PaymentProcessor();
echo $proc->apiKey; // ERROR

4. Verzionisanje API-ja

Javne metode su obaveza prema korisnicima:

class UserService {
    // Javni interfejs - ne sme se menjati
    public function findById(int $id): User {
        return $this->internalFind($id);
    }
    
    // Privatna - moze se slobodno menjati
    private function internalFind(int $id): User {
        // Kompleksna logika
    }
}

Dobar dizajn sa modifikatorima

class User {
    private int $id;
    private string $name;
    private string $email;
    private string $passwordHash;
    protected DateTime $createdAt;
    
    public function __construct(string $name, string $email) {
        $this->name = $name;
        $this->email = $email;
        $this->createdAt = new DateTime();
    }
    
    public function getName(): string {
        return $this->name;
    }
    
    public function getEmail(): string {
        return $this->email;
    }
    
    public function setPassword(string $password): void {
        if (strlen($password) < 8) {
            throw new Exception('Password too short');
        }
        $this->passwordHash = password_hash($password, PASSWORD_BCRYPT);
    }
    
    public function verifyPassword(string $password): bool {
        return password_verify($password, $this->passwordHash);
    }
    
    // Protected - mogu pristupiti samo nasleđene klase
    protected function getCreatedAt(): DateTime {
        return $this->createdAt;
    }
}

class Admin extends User {
    public function getAuditInfo(): string {
        return 'Created at: ' . $this->getCreatedAt()->format('Y-m-d');
    }
}

// Upotreba
$user = new User('John', 'john@example.com');
$user->setPassword('secure_password_123'); // OK
echo $user->getName(); // OK

// Nisu dostupni
echo $user->passwordHash; // ERROR - private
echo $user->id; // ERROR - private

Problemi bez dobrih modifikatora

// LOSE - sve je javno
class BadUser {
    public int $id;
    public string $name;
    public string $email;
    public string $password;
    public string $role;
}

$user = new BadUser();
$user->password = ''; // Obrisana lozinka!
$user->role = 'admin'; // Promenjena uloga!
$user->id = 999; // Promenjen ID!

Protected za nasleđivanje

abstract class Animal {
    private string $name; // Nije dostupan nasleđenim klasama
    protected string $species; // Dostupan nasleđenim klasama
    public string $color; // Dostupan svuda
    
    protected function makeSound(): void {
        echo 'Some sound';
    }
}

class Dog extends Animal {
    public function bark(): void {
        $this->makeSound(); // OK - protected
        echo $this->species; // OK - protected
        echo $this->name; // ERROR - private nije dostupno
    }
}

Best Practices

  • Koristi private kao podrazumevan - najstrozi nivo
  • Koristi protected za nasledjivanje
  • Koristi public samo za interfejs
  • Koristi getter/setter metode za pristup
  • Radi validaciju u setterima
  • Minimaliziraj javnu povrsinu

Zakljucak: Modifikatori vidljivosti su kritični za pisanje sigurnog, održivog koda koji se može refaktorisati bez brige o uticaju na ostatak sistema.