Основы

class

Каждое определение класса начинается с ключевого слова class, затем следует имя класса, и далее пара фигурных скобок, которые заключают в себе определение свойств и методов этого класса.

Именем класса может быть любое слово, которое не входит в список зарезервированных слов PHP, начинающееся с буквы или символа подчеркивания и за которым следует любое количество букв, цифр или символов подчеркивания. Если задать эти правила в виде регулярного выражения, то получится следующее выражение: [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*.

Класс может содержать собственные константы, переменные (называемые свойствами) и функции (называемые методами).

Пример #1 Простое определение класса


Наша группа в телеграмм для обмена идеями, проектами, мыслями, людьми в сфере ИТ г.Ростова-на-Дону: @it_rostov
class SimpleClass
{
    // объявление свойства
    public $var = 'значение по умолчанию';
    // объявление метода
    public function displayVar() {
        echo $this->var;
    }
}

Псевдо-переменная $this доступна в том случае, если метод был вызван в контексте объекта. $this является ссылкой на вызываемый объект. Обычно это тот объект, которому принадлежит вызванный метод, но может быть и другой объект, если метод был вызван статически из контекста другого объекта. Это показано на следующих примерах:

Пример #2 Переменная $this

class A
{
    function foo()
    {
        if (isset($this)) {
            echo '$this определена (';
            echo get_class($this);
            echo ")\n";
        } else {
            echo "\$this не определена.\n";
        }
    }
}
class B
{
    function bar()
    {
        // Замечание: следующая строка вызовет предупреждение, если включен параметр E_STRICT.
        A::foo();
    }
}
$a = new A();
$a->foo();
// Замечание: следующая строка вызовет предупреждение, если включен параметр E_STRICT.
A::foo();
$b = new B();
$b->bar();
// Замечание: следующая строка вызовет предупреждение, если включен параметр E_STRICT.
B::bar();

Результат выполнения данного примера:


$this определена (A)
$this не определена.
$this определена (B)
$this не определена.


new

Для создания экземпляра класса используется директива new. Новый объект всегда будет создан, за исключением случаев, когда он содержит конструктор, в котором определен вызов исключения в случае ошибки. Рекомендуется определять классы до создания их экземпляров (в некоторых случаях это обязательно).

Если с директивой new используется строка (string), содержащая имя класса, то будет создан новый экземпляр этого класса. Если имя находится в пространстве имен, то оно должно быть задано полностью.

Пример #3 Создание экземпляра класса

$instance = new SimpleClass();
// Это же можно сделать с помощью переменной:
$className = 'Foo';
$instance = new $className(); // Foo()

В контексте класса можно создать новый объект через new self и new parent.

Когда происходит присвоение уже существующего экземпляра класса новой переменной, то эта переменная будет указывать на этот же экземпляр класса. Тоже самое происходит и при передаче экземпляра класса в функцию. Копию уже созданного объекта можно создать через ее клонирование.

Пример #4 Присваивание объекта

$instance = new SimpleClass();
$assigned   =  $instance;
$reference  =& $instance;
$instance->var = '$assigned будет иметь это значение';
$instance = null; // $instance и $reference становятся null
var_dump($instance);
var_dump($reference);
var_dump($assigned);

Результат выполнения данного примера:


NULL
NULL
object(SimpleClass)#1 (1) {
["var"]=>
string(30) "$assigned будет иметь это значение"
}

В PHP 5.3.0 введены несколько новых методов создания экземпляров объекта:

Пример #5 Создание новых объектов

class Test
{
    static public function getNew()
    {
        return new static;
    }
}
class Child extends Test
{}
$obj1 = new Test();
$obj2 = new $obj1;
var_dump($obj1 !== $obj2);
$obj3 = Test::getNew();
var_dump($obj3 instanceof Test);
$obj4 = Child::getNew();
var_dump($obj4 instanceof Child);

Результат выполнения данного примера:


bool(true)
bool(true)
bool(true)

extends

Класс может наследовать методы и свойства другого класса используя ключевое слово extends при его описании. Невозможно наследовать несколько классов, один класс может наследовать только один базовый класс.

Наследуемые методы и свойства могут быть переопределены (за исключением случаев, когда метод класса объявлен как final) путем объявления их с теми же именами, как и в родительском классе. Существует возможность доступа к переопределенным методам или статическим методам путем обращения к ним через parent::

Когда переопределяются методы число и типы аргументов должны оставаться такими же как и были, иначе PHP вызовет ошибку уровня E_STRICT. Это не относится к конструктору, который можно переопределить с другими параметрами.

Пример #6 Простое наследование классов

class ExtendClass extends SimpleClass
{
    // Переопределение метода родителя
    function displayVar()
    {
        echo "Расширенный класс\n";
        parent::displayVar();
    }
}
$extended = new ExtendClass();
$extended->displayVar();

Результат выполнения данного примера:


Расширенный класс
значение по умолчанию

::class

Начиная с версии PHP 5.5 можно использовать ключевое слово class для разрешения имени класса. С помощью конструкции ClassName::class можно получить строку с абсолютным именем класса ClassName. Обычно это довольно полезно при работе с классами, использующими пространства имен.

Пример #7 Разрешение имени класса

namespace NS {
    class ClassName {
    }
    echo ClassName::class;
}

Результат выполнения данного примера:


NS\ClassName


User Contributed Notes 20 notes



84
aaron at thatone dot com5 years ago
// Assignment of an object
Class Object{
   public $foo="bar";
};
$objectVar = new Object();
$reference =& $objectVar;
$assignment = $objectVar
//
// $objectVar --->+---------+
//                |(handle1)----+
// $reference --->+---------+   |
//                              |
//                +---------+   |
// $assignment -->|(handle1)----+
//                +---------+   |
//                              |
//                              v
//                  Object(1):foo="bar"
//


35
Doug3 years ago
class Classy {
const       STAT = 'S' ; // no dollar sign for constants (they are always static)
static     $stat = 'Static' ;
public     $publ = 'Public' ;
private    $priv = 'Private' ;
protected  $prot = 'Protected' ;
function __construct( ){  }
public function showMe( ){
    print '<br /> self::STAT: '  .  self::STAT ; // refer to a (static) constant like this
    print '<br /> self::$stat: ' . self::$stat ; // static variable
    print '<br />$this->stat: '  . $this->stat ; // legal, but not what you might think: empty result
    print '<br />$this->publ: '  . $this->publ ; // refer to an object variable like this
    print '<br />' ;
}
}
$me = new Classy( ) ;
$me->showMe( ) ;
/* Produces this output:
self::STAT: S
self::$stat: Static
$this->stat:
$this->publ: Public
*/


19
Marcus2 years ago
// PHP 5
// class definition
class Bear {
    // define properties
    public $name;
    public $weight;
    public $age;
    public $sex;
    public $colour;
    // constructor
    public function __construct() {
        $this->age = 0;
        $this->weight = 100;
    }
    // define methods
    public function eat($units) {
        echo $this->name." is eating ".$units." units of food... ";
        $this->weight += $units;
    }
    public function run() {
        echo $this->name." is running... ";
    }
    public function kill() {
        echo $this->name." is killing prey... ";
    }
    public function sleep() {
        echo $this->name." is sleeping... ";
    }
}
// extended class definition
class PolarBear extends Bear {
    // constructor
    public function __construct() {
        parent::__construct();
        $this->colour = "white";
        $this->weight = 600;
    }
    // define methods
    public function swim() {
        echo $this->name." is swimming... ";
    }
}


17
wbcarts at juno dot com5 years ago
/*
 * Point3D.php
 *
 * Represents one locaton or position in 3-dimensional space
 * using an (x, y, z) coordinate system.
 */
class Point3D
{
    public $x;
    public $y;
    public $z;                  // the x coordinate of this Point.
    /*
     * use the x and y variables inherited from Point.php.
     */
    public function __construct($xCoord=0, $yCoord=0, $zCoord=0)
    {
        $this->x = $xCoord;
    $this->y = $yCoord;
        $this->z = $zCoord;
    }
    /*
     * the (String) representation of this Point as "Point3D(x, y, z)".
     */
    public function __toString()
    {
        return 'Point3D(x=' . $this->x . ', y=' . $this->y . ', z=' . $this->z . ')';
    }
}
/*
 * Line3D.php
 *
 * Represents one Line in 3-dimensional space using two Point3D objects.
 */
class Line3D
{
    $start;
    $end;
    public function __construct($xCoord1=0, $yCoord1=0, $zCoord1=0, $xCoord2=1, $yCoord2=1, $zCoord2=1)
    {
        $this->start = new Point3D($xCoord1, $yCoord1, $zCoord1);
        $this->end = new Point3D($xCoord2, $yCoord2, $zCoord2);
    }
    /*
     * calculate the length of this Line in 3-dimensional space.
     */ 
    public function getLength()
    {
        return sqrt(
            pow($this->start->x - $this->end->x, 2) +
            pow($this->start->y - $this->end->y, 2) +
            pow($this->start->z - $this->end->z, 2)
        );
    }
    /*
     * The (String) representation of this Line as "Line3D[start, end, length]".
     */
    public function __toString()
    {
        return 'Line3D[start=' . $this->start .
            ', end=' . $this->end .
            ', length=' . $this->getLength() . ']';
    }
}
/*
 * create and display objects of type Line3D.
 */
echo '<p>' . (new Line3D()) . "</p>\n";
echo '<p>' . (new Line3D(0, 0, 0, 100, 100, 0)) . "</p>\n";
echo '<p>' . (new Line3D(0, 0, 0, 100, 100, 100)) . "</p>\n";


13
Manish Gupta2 years ago
class Foo
{
$bar = 'Hi There';
public function Print(){
    echo $bar;
}
}


2
alan at alan-ng dot net6 years ago
$_SESSION['instance']=...;
$instance=new SomeClass;


9
info at youwanttoremovethisvakantiebaas dot nl5 years ago
$x = new b();
class b extends a {}
class a { }


7
moty66 at gmail dot com4 years ago
class a {
    public static $foo = 'I am foo';
    public $bar = 'I am bar';
    
    public static function getFoo() { echo self::$foo;    }
    public static function setFoo() { self::$foo = 'I am a new foo'; }
    public function getBar() { echo $this->bar;    }            
}
$ob = new a();
a::getFoo();     // output: I am foo    
$ob->getFoo();    // output: I am foo
//a::getBar();     // fatal error: using $this not in object context
$ob->getBar();    // output: I am bar
                // If you keep $bar non static this will work
                // but if bar was static, then var_dump($this->bar) will output null 
// unset($ob);
a::setFoo();    // The same effect as if you called $ob->setFoo(); because $foo is static
$ob = new a();     // This will have no effects on $foo
$ob->getFoo();    // output: I am a new foo


3
php at kingsquare dot nl6 months ago
// ways of creating stdClass instances
$x = new stdClass;
$y = (object) null;        // same as above
$z = (object) 'a';         // creates property 'scalar' = 'a'
$a = (object) array('property1' => 1, 'property2' => 'b');


4
Jeffrey5 years ago
$customer_name;
$item_name;
$item_price;
$customer_address;
$item_qty;
$item_total;


1
Dan Dascalescu7 years ago
class MyClass {
   public $message = 'Hello';
   public function MyClassFunction() {
       function innerFunction(&$this_thing, $message = null) {
          $this_thing->message = (!is_null($message)) ? $message : $this_thing->message;
          $this_thing->echo_something();
       }
       innerFunction($this); // echoes 'Hello'
       innerFunction($this, '<br/>New Message'); // echoes '<br/>New Message'
   }
   
   public function echo_something() {
       echo $this->message;
   }
}
$class = new MyClass;
$class->MyClassFunction();


2
chris (@) xeneco (dot) co (dot) uk5 years ago
class A {
    
    public $x = 'A';
    public function foo() {
        $b = new B;
        $b->bar();
        return $this->x;
    }
}
class B extends A {
    public function bar() {
        $this->x = 'B';
    }
}
$a = new A
echo $a->foo();    //A


0
Achilles at TheGreatWarrior dot com4 months ago
    class A {
        protected function func1() {
            echo("I'm func1 in A!<br/>");
        }
        private function func2() {
            echo("I'm func2 in A!<br/>");
        }
    }
    
    class B extends A {
        public function func3() {
            echo("I'm func3 in B!<br/>");
            $this->func1();
            $this->func2();  // Call to private function from extended class results in a fatal error
        }
    }
    
    $b = new B;
    $b->func3();  // Ends in a fatal error
// OR
    $b->func1();  // Call to protected function from outside world results in a fatal error


-2
ialsoagree4 years ago
class MyClass {
   public $message = 'Hello';
   public function MyClassFunction() {
       function InnerFunction() {
          echo $this->message; // Reports a fatal error
       }
       innerFunction();
   }
}
$class = new MyClass;
$class->MyClassFunction();


-4
ben dot corne at gmail dot com3 years ago
class Foo {
  private $className = 'Bar';
  
  public function make() {
    return new $this->className();
  }
  
  public function callClassName() {
   $this->className();
  }
  public function className() {
    echo "foo\n";
  }
};
class Bar {
  public function hello() {
    echo "bar\n";
  }
};
$foo = new Foo();
$bar = $foo->make();
echo "expecting 'bar': ";
$bar->hello();
echo "expecting 'foo': ";
$foo->callClassName();


-5
ccheeboon at yahoo dot com1 year ago
class TestClass
{
    private $have_girlfren=false;
    //
    private function __construct( $have_girlfren )
    {
        echo "sixth day<br />
 ";
         $this->have_girlfren=$have_girlfren;        
         $this->existenceRequirement();        
    }
    //
    private function existenceRequirement()
    {
        if( $this->have_girlfren==false )
        {
        echo 'i want to die<br />
';
        $this->__destruct();
            
          throw new Exception();
        }
    }
    ///////////////////////
    function __destruct()
    {
        echo "i am dead<br />
";
    }
    //////////////////
    static function getNewInstance( $have_girlfren)
    {
        try{
        $new_obj=new TestClass( $have_girlfren);
        return $new_obj;
        
        }
        catch(Exception $e)
        {
            
            unset($new_obj);
            echo "rest in peace<br />
";
            return false;
        }    
    }
    //
    function gotGirlFren()
    {
        return $this->have_girlfren;
    }
}
$test_obj=TestClass::getNewInstance( false );
if( $test_obj )
echo "bye test oby closing<br />
";
else
echo "instance commit suicide<br />
";
echo "--------------<br />
";
echo "-the end--";


-2
alex c4 years ago
ok this really basic but I always forget this. I always get an error like:
Fatal error: Call to a member function on a non-object
when i deal with oops
if it were me finding the error i'd search the internet for hours and then it would occur to me, I'm putting my class operator inside a function, but i would define the class in global file.
so like this:
test.php
<?
include(class.php);
$class = new newclassname;
function function1(){
  $class->dofunc();
}
?>
you'll get some die errors and try and do this with function1,
function function1(){
  newclassname::dofunc();
}
but if you're using $this inside your class then you'll get another error on non object
so basically, all you need to do is:
function function1(){
  $class = new newclassname;
  $class->dofunc();
}
or
function function1(){
  global $class;
  $class->dofunc();
}
i know it's simple, but it always gets me!




Смотрите также:
Описание на ru2.php.net
Описание на php.ru

.

Популярное:


Содержание: