プログラム言語 固定値、コンフィグ値

固定値

固定値クラス
namespace App\Constants;

class LANG
{
  const INFO = [
    1 => 'PHP',
    2 => 'Python',
    3 => 'Java',
  ];
}

コントローラ/モデル
use App\Constants\LANG;

class XXXXXX extends Model
{
  function XXXXXX(){
    foreach(LANG::INFO as $key => $name){
     ~
    }
 }
}

アプリ設定ファイル
※config\app.php
return [
  'aliases' => [
    ~
    // 定数ファイル
    'LANG' => App\Constants\LANG::class,
  ],
];

ビュー(↑のアプリ設定ファイルへの追記が必要)
@foreach (\LANG::INFO as $key => $name)
 {{$name}}
@endforeach

define(“CONST_TEISUU”, “定数”);

print CONST_TEISUU;
→定数

from const

value1 = const.KEY1
‘aaa’

const.py
KEY1 = ‘aaa’
KEY2 = ‘bbb’

【定数】:プリプロセッサにより、コンパイル前に置き換えられる。
データ型は自動判別される。

オブジェクト型マクロ定数
#define DEF_NUM (5)
#define DEF_STR (“AAA”)

関数型マクロ定数
#define DEF_FUNC(a) ( (DEF_NUM + a) )

Console::WriteLine(DEF_NUM);
→ 5
Console::WriteLine(DEF_STR);
→ AAA
Console::WriteLine(DEF_FUNC(10));
→ 15

【固定値】
const int CONST_MYINT = 5;
const string CONST_MYSTR = “AAA”;

CONST_MYINT = 10;
// エラー

※関数ポインタにおいてメモリアドレスを変更されたくない場合の使い方
void myFunc(const int *prm){}

ENUM(列挙体)(enum)

composer require bensampo/laravel-enum
※myclabsとは別

use BenSampo\Enum\Enum;
class TestEnum extends Enum
  const ENUM1 => 0,
  const ENUM2 => 1,
  const ENUM3 => 2,
}];

TestEnum::ENUM1 → 0
TestEnum::getKey(TestEnum::ENUM1) → ENUM1
TestEnum::getDescription(TestEnum::ENUM1) → Eum1 ※Keyが文字に変換される
TestEnum::getValues() → [0, 1, 2]
TestEnum::getKeys() → [ENUM1, ENUM2, ENUM3]
TestEnum::asSelectArray() → [
 [1 => “Enum1”],
 [2 => “Enum2”],
 [3 => “Enum3”],
]

enum Lang {
 TypeScript = 1,
 JavaScript = 2,
 PHP = 3,
};

let ts: Lang = Lang.TypeScript;
let js: Lang = Lang.JavaScript;
let php: Lang = Lang.PHP;

console.log(`ts:${ts}`); → ts:1
console.log(`ts:${js}`); → js:2
console.log(`ts:${php}`); → php:3

var enmState = {
  Stop: 0,
  Moving: 1,
  End: 2
};
var gState = enmState.Stop;
from enum import Enum

class UnitType(Enum):
 GRAM = “g”
 LITER = “L”
 METER = “M”

 @classmethod
 def get_unit_value(cls, unit_name):
  return cls(unit_name).value
 
 @classmethod
 def get_unit_name(cls, unit):
  for key, value in cls.__members__.items():
   if value.value == unit:
    return key
  return None

 @classmethod
 def get_names(cls):
  return [unit.name for unit in cls]
 
 @classmethod
 def get_values(cls):
  return [unit.value for unit in cls]
 
print(UnitType.GRAM)
→ UnitType.GRAM
print(UnitType.GRAM.value)
→ g
print(UnitType.GRAM.name)
→ GRAM
print(UnitType.get_unit_value(UnitType.GRAM))
→ g
print(UnitType.get_unit_name(UnitType.GRAM.value))
→ GRAM
print(UnitType.get_names())
→ [‘GRAM’, ‘LITER’, ‘METER’]
print(UnitType.get_values())
→ [‘g’, ‘L’, ‘M’]

enum enmTest1
{
  enum1,
  enum2,
  enum3
}

enum enmTest2
{
  enum1 = 1,
  enum2 = 2,
  enum3 = 3
}

enum enmTest3
{
  enum1 = “1”,
  enum2 = “2”,
  enum3 = “3”
}

public void myForm_Load(object sender, EventArgs e)
{
  SubRoutine(test1: enmTest1.enum1,
         test2: enmTest2.enum1,
         test3: enmTest3.enum3);
}

private void SubRoutine(enmTest1 test1,
             enmTest2 test2,
             enmTest3 test3)
{
 ~
}

Private Enum enmTest1
  enum1
  enum2
  enum3
End Enum

Private Enum enmTest2
  enum1 = 1
  enum2 = 2
  enum3 = 3
End Enum

VBでは文字列を設定する事はできない

Private Enum enmTest3
  enum1 = “1”
  enum2 = “2”
  enum3 = “3”
End Enum

Private Sub myForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load

  Call SubRoutine(test1:=enmTest1.enum1, _
              test2:=enmTest2.enum1)

End Sub

Private Sub SubRoutine(ByVal test1 As enmTest1, _
                  ByVal test2 As enmTest2)
 ~
End Sub

enum myEnum
{
  value1 = 0,
  value2 = 1,
  value3
};

int myInt = myEnum::value1;
※int型変数へ格納可能

Console::WriteLine(myInt);
// ⇒0
return 0;

package myPackage;

public class MyEnum {
 public enum VALUE{
  VAL1,
  VAL2,
  VAL3
 }
}

import static myPackage.MyEnum.VALUE.*;

public class MyMain {
 public static void main(String[] args) {
  int intVal1 = VAL1.ordinal();
  自動的に使用できるメソッド(正確にはMyEnumが自動的に継承するenumクラスのメソッド)
  → 0
  String strVal1 = VAL1.name();
  自動的に使用できるメソッド(正確にはMyEnumが自動的に継承するenumクラスのメソッド)
  → VAL1
 }
}

【独自メソッドを定義】
package myPackage;

public class MyEnum {
 public enum custEnum{
  intVAL1(1, “name1”),
  intVAL2(2, “name2”),
  intVAL3(3, “name3”); ←!
  メソッドを作成する場合は「;」で終わる
  下部のコンストラクタを呼び出す

  
  private final int index;
  private final String name;
  セッターを作成しない場合は「final」
  
  内部からのみ呼び出されるコンストラクタ
  custEnum(int index, String name){
   this.index = index;
   this.name = name;
  }
  外部から呼び出されるメソッド
  public int getIndex() {
   return this.index;
  }
  外部から呼び出されるメソッド
  public String getMyName() {
   return this.name;
  }
 }
}

import static myPackage.MyEnum.custEnum.*;

public class MyMain {
 public static void main(String[] args) {
  int intVal = VAL1.getIndex();
  → 1
  intVal = VAL1.ordinal(); も○
  → 0
  
  String strVal = VAL1.getMyName();
  → name1
  strVal = VAL1.name(); も○
  → Val1
 }
}

コンフィグ値

app.config.from_object(‘config.database.Development’)
app.logger.info(app.config.get(‘SETTING’))
→ 開発環境の設定

app.config.from_object(‘config.database.Production’)
app.logger.info(app.config.get(‘SETTING’))
→ 本番環境の設定

project
└ config
 └ database.py

※database.py
class Development(object):
 SETTING = “開発環境の設定”

class Production(object):
 SETTING = “本番環境の設定”

リテラル

ソースコードに直接記述された変数、定数以外の値。
リテラル領域という変数等とは異なるメモリ領域に作成される。
(C#、JAVAにおけるリテラル値の参照については、「文字列型の参照」参照)
文字列リテラルを記述する場合はエスケープ処理の防止を考慮する必要がある。
(「エスケープ」参照)

Console.WriteLine(“C:\test\test.txt”);
//⇒ C:    est    est.txt
//⇒ C:[tab]est[tab]est.txt
タブ入力を意味する特殊文字「\t」と見なされている。

Console.WriteLine(@“C:\test\test.txt”);
//⇒ C:\test\test.txt
「@」を付けるとエスケープ処理されない。

Console.WriteLine(“C:\\test\\test.txt”);
//⇒ C:\test\test.txt

「@」を付けない場合。
「\」の前に更に「\」を付ける。

リテラル
String myStr = “5”; //文字列リテラル
int myInt = 5; //整数リテラル
double myDoublt = 5.0; //浮動小数点リテラル
Boolean myBool = true; //真偽リテラル

リテラルにおける型の明示(接尾辞)
long myLong = 5L(または5.0l);
⇒ myLong : 5
float myFloat = 5F(または5f);
⇒ myFloat : 5.0

int myInt = 10F; ⇒エラー

整数リテラルの他基数表示
int myInt = 10; //10進数
int myInt = 010; //8進数
int myInt = 0x10; //16進数
int myInt = 0b10; //2進数

「_」(アンダースコア)
整数リテラルを読みやすくする為の記号
int a = 123_456_789;

使用ルール
・リテラルの先頭と末尾には記述できない
・記号の前後には記述できない

echo関数による文字列の出力
<?php
 echo “aaaaa<br />\n”;
 echo “bbbbb<br />\n”;
 ↓ リテラルへのphp変数の埋め込み
 「プログラム言語 標準関数(テキスト系)/バインド(埋め込み)」参照
?>

html文字中へphp埋め込み
<p>
 aaaaa<br />
 bbbbb<br />
 ccc<?php echo $purpose; ?>ccc<br />
 <a href=”test.php”>ddd<a>
</p>

ヒアドキュメント
\n無しで改行、特殊文字のエスケープ不要
<<< がヒアドキュメントの開始合図
<<< の次に書いた文字が再度出現するまで全て出力される

<p>
 <?php
  $purpose = “ppp”;
  
  echo <<< HERE
  aaaaa<br />
  bbbbb<br />
  ↓ リテラルへのphp変数の埋め込み
  ccc{$purpose}ccc<br />
  <a href=”test.php”>ddd<a>
  HERE;
 ?>
</p>

結果
aaaaa
bbbbb
cccpppccc
ddd