2013年2月3日

php 「$this」 , 「self::」について

参考 http://php.net/manual/ja/language.oop5.properties.php


$thisは、自分自身のオブジェクトを指し、
self::は静的アクセスという理解しかないので、ここで一度整理したいと思う。



上記には、静的でないプロパティアクセスにはオブジェクト演算子(->)
               静的なプロパティへのアクセスにはダブルコロン(::)を使う。と記載されている。


では、静的でないプロパティと静的なプロパティの違いについてみていこう。

クラスプロパティもしくはメソッドを static として宣言することで、 クラスのインスタンス化の必要なしにアクセスすることができます。 static なプロパティは、インスタンス化されたクラスオブジェクトから アクセスすることはできません (static なメソッドにはアクセスできます)。static メソッドは、オブジェクトのインスタンスを生成せずに コールすることができます。疑似変数 $this は、 static として宣言されたメソッドの内部から利用することはできません。static プロパティは、矢印演算子 -> によりオブジェクトからアクセス することはできません。

以下サンプルプログラムを作ってみた。
staticプロパティは静的なので、self::でアクセスする。
静的ではなく、オブジェクトの場合は->でアクセスする。
staticメゾットについては、ダブルコロン(::)、アロー演算子(->;)どちらでもアクセス可能。

静的なので、インスタンス化されたオブジェクト空間とは、別にメモリ確保されている事になる。
これを確かめるためにメモリ空間を覗きたかったが、現在の設定ではボタンがDisableであった。
残念。またの機会にでもメモリ空間は見れるようにしておきたい。





class BaseClass
 {
  public $publicVar = 'In Base Class public value';
  protected  $protextedVar = 'In Base Class protected value';
  private $privateVar='In Base Class private value';
 
  public static $public_static_Var = 'In Base Class public static value';
  protected static  $protexted_static_Var = 'In Base Class protected static value';
  private static $private_static_Var='In Base Cla ss private static value';
 
function __construct() 
{
print'In Base Class __constructor';
}

function __destruct()
{
print'In Base Class __destructor';
}

function viewPrint() 
{
var_dump($this);
print'In Base Class viewPrint';

}
function  propertyBaseClassAccess()
{
$this->privateVar;
$this->protextedVar;
$this->publicVar;

//static の為、selfでアクセスOK
self::$public_static_Var;
self::$protexted_static_Var;
self::$private_static_Var;
//static の為、this->ではアクセスNG
// $this->public_static_Var;    //Error Strict standards: Accessing static property BaseClass::$public_static_Var as non static
// $this->protexted_static_Var; //Error Strict standards: Accessing static property BaseClass::$protexted_static_Var as non static
// $this->private_static_Var;   // Error Strict standards: Accessing static property BaseClass::$private_static_Var as non static

}
  public static function  staticpropertyBaseClassAccess()
{
// $this->privateVar;   //Fatal error: Using $this when not in object context
// $this->protextedVar; //Fatal error: Using $this when not in object context
// $this->publicVar;    //Fatal error: Using $this when not in object context

self::$public_static_Var;
self::$protexted_static_Var;
self::$private_static_Var;

}
public function setPublicVar($x){ $this->publicVar=$x; }
  public function setProtextedVar($x){ $this->protextedVar=$x; }
public function setPrivateVar($x){ $this->privateVar=$x; }

public function getPublicVar(){ return $this->publicVar; }
public function getProtextedVar(){ return $this->protextedVar; }
public function getPrivateVar(){ return  $this->privateVar; }

 }

 class SubClass extends BaseClass
 {
// public $publicVar = 'In Sub Class public value';
// protected  $protextedVar = 'In Sub Class protected value';
// private $privateVar='In Sub Class private value';

  function __construct() 
  {
  parent::__construct();
print'In Sub Class __constructor';
  }
 
  function __destruct() 
  {
  parent::__destruct();
  print'In Sub Class __destructor';
  }
  function viewPrint() 
{
var_dump($this);
print'In SubClass viewPrint';

}

//   public function setPublicVar($x){ $this->publicVar=$x; }
//   public function setProtextedVar($x){ $this->protextedVar=$x; }
//   public function setPrivateVar($x){ $this->privateVar=$x; }
 
//   public function getPublicVar(){ return $this->publicVar; }
//   public function getProtextedVar(){ return $this->protextedVar; }
//   public function getPrivateVar(){ return  $this->privateVar; }
 
  }

 $baseClassObj = new BaseClass();
 $baseClassObj->viewPrint();

 //protexted,privateプロパティへのアクセスの為NG
 $baseClassObj->publicVar;
 //$baseClassObj->protextedVar; //Fatal error: Cannot access protected property BaseClass::$protextedVar
 //$baseClassObj->privateVar;   //Fatal error: Cannot access private property BaseClass::$privateVar 

 //静的ではないインスタンスからのstaticプロパティへのアクセスはすべてNG
 //$baseClassObj->public_static_Var;     //Strict standards: Accessing static property BaseClass::$public_static_Var as non static
 //$baseClassObj->protexted_static_Var;  //Fatal error: Cannot access protected property BaseClass::$protexted_static_Var 
 //$baseClassObj->private_static_Var;    //Fatal error: Cannot access private property BaseClass::$private_static_Var

 //下記のようにpublic static プロパティへのアクセスが可能
 BaseClass::$public_static_Var;
 //BaseClass::$protexted_static_Var;    //Fatal error: Cannot access protected property BaseClass::$protexted_static_Var 
 //BaseClass::$private_static_Var;      //Fatal error: Cannot access private property BaseClass::$private_static_Var

 $baseClassObj->propertyBaseClassAccess();
 $baseClassObj->staticpropertyBaseClassAccess();

 BaseClass::staticpropertyBaseClassAccess(); 

 $subClassObj = new SubClass();

 $objArray = array($subClassObj,$baseClassObj);

 print $objArray[1]->publicVar;
 print $objArray[1]::$public_static_Var;

-----------------------------------------------------------------------------

In Base Class __constructor
object(BaseClass)[1]
  public 'publicVar' => string 'In Base Class public value' (length=31)
  protected 'protextedVar' => string 'In Base Class protected value' (length=34)
  private 'privateVar' => string 'In Base Class private value' (length=32)
In Base Class viewPrint
In Base Class __constructor
In Sub Class __constructor
In Base Class public value
In Base Class public static value
In Base Class __destructor
In Base Class __destructor
In Sub Class __destructor




php コンストラクタとデストラクタ




コンストラクタの実行タイミングは分かるけど、
デストラクタの実行タイミングがいまいちよく分かりません。

そこで、下記を参考に


参考:http://php.net/manual/ja/language.oop5.decon.php
引用-----------------------------------------------
デストラクタメソッドは、 
特定のオブジェクトを参照するリファレンスがひとつもなくなったときにコールされます。 
 あるいは、スクリプトの終了時にも順不同でコールされます。


ふむふむ。


class BaseClass
 {
  public $publicVar = 'In Base Class public value';
  protected  $protextedVar = 'In Base Class protected value';
  private $privateVar='In Base Class private value';
  
 function __construct() 
 {
  print'In Base Class __constructor';
 }
 
 function __destruct()
 {
  print'In Base Class __destructor';
 }
 
 function viewPrint() 
 {
  var_dump($this);
  print'In Base Class viewPrint';
  
 }
 
 public function setPublicVar($x){ $this->publicVar=$x; }
  public function setProtextedVar($x){ $this->protextedVar=$x; }
 public function setPrivateVar($x){ $this->privateVar=$x; }
 
 public function getPublicVar(){ return $this->publicVar; }
 public function getProtextedVar(){ return $this->protextedVar; }
 public function getPrivateVar(){ return  $this->privateVar; }
 
 }
 
 class SubClass extends BaseClass
 {
  public $publicVar = 'In Sub Class public value';
  protected  $protextedVar = 'In Sub Class protected value';
  private $privateVar='In Sub Class private value';
  
  function __construct() 
  {
   parent::__construct();
  print'In Sub Class __constructor';
  }
  
  function __destruct() 
  {
   parent::__destruct();
   print'In Sub Class __destructor';
  }
  public function setPublicVar($x){ $this->publicVar=$x; }
  public function setProtextedVar($x){ $this->protextedVar=$x; }
  public function setPrivateVar($x){ $this->privateVar=$x; }
  
  public function getPublicVar(){ return $this->publicVar; }
  public function getProtextedVar(){ return $this->protextedVar; }
  public function getPrivateVar(){ return  $this->privateVar; }
  
  }
 
 $baseClassObj = new BaseClass();
 $baseClassObj->viewPrint();
 
 $subClassObj = new SubClass();
 $subClassObj->viewPrint();




---------------------------------------------------------------------
OutPut

In Base Class __constructor   <------base class="xdebug-var-dump" dir="ltr" pre="">object(BaseClass)[1]
  public 'publicVar' => string 'In Base Class public value' (length=31)
  protected 'protextedVar' => string 'In Base Class protected value' (length=34)
  private 'privateVar' => string 'In Base Class private value' (length=32)

In Base Class viewPrint    <------ ase="" class="" code="">リファレンス
In Base Class __constructor    <------base br="" class="">
In Sub Class __constructor     <------sub ase="" class="xdebug-var-dump" dir="ltr" pre="">
object(SubClass)[2]
  public 'publicVar' => string 'In Sub Class public value' (length=30)
  protected 'protextedVar' => string 'In Sub Class protected value' (length=33)
  private 'privateVar' => string 'In Sub Class private value' (length=31)
  private 'privateVar' (BaseClass) => string 'In Base Class private value' (length=32)

In Base Class viewPrint <-------- br="" class="" sub="">In Base Class __destructor <-------- br="" class="" parent::__destruct="" sub="">In Sub Class __destructor   <-------- br="" class="" sub="">In Base Class __destructor <-------- base="" class="" code="" ub="">
                                         Base Class最後のリファレンスとなり、
                                         最終的にBase Class デストラクタがCallされる

なるほど。
最終的に Sub Classのデストラクタ後に親クラスのBase ClassデストラクタがCallされた。
一つ勉強になった。


 

eclipse PDT Xdebug

Ecilpse DownLoad

http://www.zend.com/en/community/pdt/downloads
ProductVersionFormat/SizeNotes
Zend Eclipse PDTPDT 3.0.2 w/Eclipse Indigo(ZIP) 92.61 MBN/A
Studio Web Debugger20110410(ZIP) 2.16 MBInstallation Guide






2013年1月27日

classをつくってみる



class Human{
public $name;
public $height;
public $weight;

function show(){

print "{$this->name}さんの身長は{$this->height}cm,体重は{$this->weight}kg";
}

}


$taro = new Human();
$taro->name='太郎';
$taro->height=174;
$taro->weight=70;
$taro->show();

print "
".var_dump($taro);

print "
taro->name=".$taro->name."
";

//ここでオブジェクトから配列に変換
$taroarray = get_object_vars($taro);
print "
".var_dump($taroarray);

print "
taroarray[name]=".$taroarray['name']."
";

$hanako = new Human();
$hanako->name='花子';
$hanako->height=158;
$hanako->weight=48;
$hanako->show();

print "
".var_dump($hanako);

?>




[php]配列、連想配列について



phpの配列、連想配列について


keyについて少し抵抗があったが、
単純に要素名を付けることができるだけでした。
なむ。

配列 関数 (<-array p="">

---------------------------------------------------------------------
$person{'Name'} = "Mimata";
$person{'Age'} = "19";
$person{'Tel'} = "0120-123-4567";

print var_dump($person);
 "Tanaka",
     "Age"  => 26,
      "Tel" => "0120-345-9876");
   
print var_dump($person1);


foreach($person as $key => $value)
{
 print "
[$key] ... $value"."";
}
foreach($person1 as $key => $value)
{
 print "
[$key] ... $value"."";
}

$person2 = array($person,$person1);
print var_dump($person2);

?>;
---------------------------------------------------------------------




































参考:http://c-brains.jp/blog/wsg/08/04/14-192257.php

出力結果



phpの基礎から

仕事でphpを使う事になったので、
今後は組み込み技術より、web技術中心にアップしていきたいと思います。

ぼくは、今までしっかりオブジェクト指向のコードを設計し組んだことがない。
なので、設計思想などの基礎的な個所からやっていきたい。

そもそもオブジェクト指向って?

特徴



これも興味がある。
オブジェクトデータベース
これは次の機会に。


PHPって?

PHP: Hypertext Preprocessor

ver1.0は1995年なのでずいぶん若い言語である。


ソフトウェア危機からオブジェクトの概念が生まれたそうですが、
  日本のプロジェクトはデスマーチが多い。いろんな理由があって
  それぞれが絡み合ってですマーチとなる。
  しかし、ソフトウェア技術のみポイントだけ絞ったときに
  オブジェクト指向プログラミングのレベルを上げれれば、
  ソフトウェア観点での問題はかなり減るのかもしれない。と思った。


とまぁ~
まずは環境をインストする。

参考:
http://www.adminweb.jp/xampp/

php環境インスト
 B方式: インストーラ無しの「インストール」
xampp-win32-1.8.1-VC9.zip
C:\xampp

この女性の人はなんなんだろ~。

--------------------------------------------------------------------------------------------------

  • Apache 2.4.3
  • MySQL 5.5.27
  • PHP 5.4.7
  • phpMyAdmin 3.5.2.2
  • FileZilla FTP Server 0.9.41
  • Tomcat 7.0.30 (with mod_proxy_ajp as connector)
  • Strawberry Perl 5.16.1.1 Portable
  • XAMPP Control Panel 3.1.0 (from hackattack142)

--------------------------------------------------------------------------------------------------

動作確認

--------------------------------------------------------------------------------------------------


12:54:29  [main] Initializing Control Panel
12:54:29  [main] Windows Version: Windows Vista Home Premium SP2 32-bit
12:54:29  [main] XAMPP Version: 1.8.1
12:54:29  [main] Control Panel Version: 3.1.0 Beta 6 [ Compiled: September 20th 2012 ]
12:54:29  [main] Running with Administrator rights - good!
12:54:29  [main] XAMPP Installation Directory: "c:\xampp\"
12:54:29  [main] Checking for prerequisites
12:56:03  [main] All prerequisites found
12:56:03  [main] Initializing Modules
12:56:03  [main] Starting Check-Timer
12:56:03  [main] Control Panel Ready
12:56:40  [Apache] Installing service...
12:56:42  [Apache] Successful!
12:56:44  [mysql] Installing service...
12:56:45  [mysql] Successful!
12:57:57  [main] Executing "services.msc"
13:09:35  [Apache] Attempting to start Apache service...
13:09:39  [mysql] Attempting to start MySQL service...
13:09:39  [Apache] Status change detected: running
13:09:42  [mysql] Status change detected: running


--------------------------------------------------------------------------------------------------



http://localhost/php/hello.php



echo "
hello world!";

print "
はじめまして";


?>

<出力結果>