• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[PHP]Jak działa konstruktor z traita?

Object Storage Arubacloud
0 głosów
358 wizyt
pytanie zadane 28 października 2017 w PHP przez Blue Obywatel (1,180 p.)
edycja 28 października 2017 przez Blue

Czy konstruktor z traita nie powinien być domyślnie gotowy do użycia w klasie, która ten trait zawiera? W nowszych wersjach PHP jest przecież przeciążanie konstruktorów i innych metod? Mam taki przykładowy, bezużyteczny kod:

<?php
trait Authenticable
{
    private $password;
 
    public function __construct($password)
    {
        $this->password = $password;
    }
 
    public function getPassword()
    {
        return $this->password;
    }
}
 
class Customer {
    use Authenticable;

    public $id;
    public $name;
    public $email;
    public $balance;
 
    public function __construct($id, $name, $email, $balance)
    {
        $this->id = $id;
        $this->name = $name;
        $this->email = $email;
        $this->balance = $balance;
    }
}
 
$customer = new Customer('password');
 

Dostaję błąd

Uncaught ArgumentCountError: Too few arguments to function Customer::__construct(), 1 passed in C:\xampp\htdocs\phpsandbox\oop\index.php on line 34 and exactly 4 expected in C:\xampp\htdocs\phpsandbox\oop\index.php:25 Stack trace: #0 C:\xampp\htdocs\phpsandbox\oop\index.php(34): Customer->__construct('password') #1 {main} thrown in C:\xampp\htdocs\phpsandbox\oop\index.php on line 25

Żeby nie było wątpliwości: wiem jak ten problem "obejść", ale... dlaczego coś takiego nie działa?

EDIT:

Nie ważne, doczytałem trochę i okazało się, że w PHP przeciążanie jest możliwe, ale nie w ten sposób.

1 odpowiedź

+1 głos
odpowiedź 28 października 2017 przez Patrycjerz Mędrzec (192,320 p.)

A trait can contain functions but does not have a constructor because no instance of a trait can exists.

Źródło: https://www.leonrenkema.nl/2012/04/05/advanced-example-of-php-traits/

W skrócie trait nie może mieć konstruktora, gdyż nie jest możliwe stworzenie jego obiektu. 

komentarz 28 października 2017 przez Blue Obywatel (1,180 p.)

Trait nie powinien mieć konstruktora, ale jak ktoś się bardzo uprze, to...

<?php

namespace App\Http\Traits;

trait RuleMessage
{
    private $fieldName;

    public function __construct($fieldName)
    {
        $this->fieldName = $fieldName;
    }

    private function getMessage()
    {
        $rule = snake_case(class_basename(self::class));
        return trans("validation.custom.{$this->fieldName}.{$rule}");
    }
}

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;
use App\Http\Traits\RuleMessage;


class HasDigit implements Rule
{
    use RuleMessage{
        RuleMessage::__construct as private __rmConstruct;
    }

    /**
     * Create a new rule instance.
     */
    public function __construct($fieldName)
    {
        $this->__rmConstruct($fieldName);
    }

    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        return preg_match('/[\d]+/', $value);
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return $this->getMessage();
    }
}

 

komentarz 28 października 2017 przez Boshi VIP (100,240 p.)
imo bezsensu...
komentarz 28 października 2017 przez Blue Obywatel (1,180 p.)
@Boshi, to nie ma sensu, ale działa.

Podobne pytania

0 głosów
1 odpowiedź 124 wizyt
0 głosów
1 odpowiedź 426 wizyt
pytanie zadane 18 listopada 2017 w PHP przez michh123 Bywalec (2,790 p.)
0 głosów
2 odpowiedzi 478 wizyt

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...