Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
static, затем сделать класс наследованный от первого – поведение будет аналогичным, переменная будет инициализирована отдельно в родительском классе и в дочернем.<?php
trait Counter {
public function inc() {
static $c = 0;
$c = $c + 1;
echo "$c\n";
}
}
class C1 {
use Counter;
}
class C2 {
use Counter;
}
$o = new C1(); $o->inc(); // echo 1
$p = new C2(); $p->inc(); // echo 1
#include <iostream>
class C {
public:
void test(int set_value = 0) {
static int i = 0;
if (set_value) {
i = set_value;
}
std::cout << i << "\n";
}
};
int main() {
C A, B;
A.test();
B.test();
A.test(1);
B.test();
return 0;
}
~/tmp$ g++ test.cpp && ./a.out
0
0
1
1
0 0 1 0.<?php
class C {
public function test($set_value = null) {
static $i = 0;
if ($set_value) {
$i = $set_value;
}
echo $i, "\n";
}
}
$A = new C;
$B = new C;
$A->test();
$B->test();
$A->test(1);
$B->test();~/tmp$ php test.php #PHP 5.3.8
0
0
1
1<?php
trait T {
public function test($set_value = null) {
static $i = 0;
if ($set_value) {
$i = $set_value;
}
echo $i, "\n";
}
}
class A { use T; }
class B { use T; }
$A1 = new A;
$A2 = new A;
$B1 = new B;
$B2 = new B;
$A1->test(1);
$B1->test(2);
$A2->test();
$B2->test();~/tmp/php-5.4.0beta2$ ./sapi/cli/php ../test.php
1
2
1
2<?php
class A {
function test($set_value=0) {
static $i = 0;
if($set_value) {
$i = $set_value;
}
echo $i.PHP_EOL;
}
}
class B extends A {}
class C extends A {}
$b = new B();
$c = new C();
$b->test();
$c->test();
$b->test(1);
$c->test();
php test.php #PHP 5.3.6
0
0
1
0
#include <iostream>
class C {
public:
virtual void test(int set_value = 0) {
static int i = 0;
if (set_value) {
i = set_value;
}
std::cout << i << "\n";
}
};
class C1 : public C {};
int main() {
C A;
C1 B;
A.test();
B.test();
A.test(1);
B.test();
return 0;
}Свойства в типажах
<?php
interface IDataSource {
public function has($key);
public function get($key, $default_value = null);
}
trait TDataSource {
public function has($key) {
return array_key_exists($key, $this->getInternalValues());
}
public function get($key, $default_value = null) {
return $this->has($key) ? $this->getInternalValues()[$key] : $default_value; // one more php 5.4 feature
}
abstract protected function getInternalValues();
}
class Storage implements IDataSource {
use TDataSource;
protected $values = array();
public function __construct(array $data) {
$this->values = $data;
}
protected function getInternalValues() {
return $this->values;
}
}<?php
trait Counter {
public function inc() {
static $c = 0;
$c = $c + 1;
echo "$c\n";
}
}
class C1 {
public function doSomething( Counter $obj ){ ... }
}
Traits в php 5.4. Разбираем детали реализации