Что означает двоеточие в программировании
For the ‘late static binding’ topic I published a code below, that demonstrates a trick for how to setting variable value in the late class, and print that in the parent (or the parent’s parent, etc.) class.
class cA
/**
* Test property for using direct default value
*/
protected static $item = ‘Foo’ ;
/**
* Test property for using indirect default value
*/
protected static $other = ‘cA’ ;
public static function method ()
print self :: $item . «\r\n» ; // It prints ‘Foo’ on everyway. 🙁
print self :: $other . «\r\n» ; // We just think that, this one prints ‘cA’ only, but. 🙂
>
public static function setOther ( $val )
self :: $other = $val ; // Set a value in this scope.
>
>
class cB extends cA
/**
* Test property with redefined default value
*/
protected static $item = ‘Bar’ ;
public static function setOther ( $val )
self :: $other = $val ;
>
>
class cC extends cA
/**
* Test property with redefined default value
*/
protected static $item = ‘Tango’ ;
public static function method ()
print self :: $item . «\r\n» ; // It prints ‘Foo’ on everyway. 🙁
print self :: $other . «\r\n» ; // We just think that, this one prints ‘cA’ only, but. 🙂
>
/**
* Now we drop redeclaring the setOther() method, use cA with ‘self::’ just for fun.
*/
>
class cD extends cA
/**
* Test property with redefined default value
*/
protected static $item = ‘Foxtrot’ ;
/**
* Now we drop redeclaring all methods to complete this issue.
*/
>
cB :: setOther ( ‘cB’ ); // It’s cB::method()!
cB :: method (); // It’s cA::method()!
cC :: setOther ( ‘cC’ ); // It’s cA::method()!
cC :: method (); // It’s cC::method()!
cD :: setOther ( ‘cD’ ); // It’s cA::method()!
cD :: method (); // It’s cA::method()!
14 years ago
Little static trick to go around php strict standards .
Function caller founds an object from which it was called, so that static method can alter it, replacement for $this in static function but without strict warnings 🙂
error_reporting ( E_ALL + E_STRICT );
function caller () $backtrace = debug_backtrace ();
$object = isset( $backtrace [ 0 ][ ‘object’ ]) ? $backtrace [ 0 ][ ‘object’ ] : null ;
$k = 1 ;
return isset( $backtrace [ $k ][ ‘object’ ]) ? $backtrace [ $k ][ ‘object’ ] : null ;
>
public $data = ‘Empty’ ;
function set_data () b :: set ();
>
static function set () // $this->data = ‘Data from B !’;
// using this in static function throws a warning .
caller ()-> data = ‘Data from B !’ ;
>
$a = new a ();
$a -> set_data ();
echo $a -> data ;
?>
Outputs: Data from B !
No warnings or errors !
17 years ago
You use ‘self’ to access this class, ‘parent’ — to access parent class, and what will you do to access a parent of the parent? Or to access the very root class of deep class hierarchy? The answer is to use classnames. That’ll work just like ‘parent’. Here’s an example to explain what I mean. Following code
class A
protected $x = ‘A’ ;
public function f ()
return ‘[‘ . $this -> x . ‘]’ ;
>
>
class B extends A
protected $x = ‘B’ ;
public function f ()
return ‘ x . ‘>’ ;
>
>
class C extends B
protected $x = ‘C’ ;
public function f ()
return ‘(‘ . $this -> x . ‘)’ . parent :: f (). B :: f (). A :: f ();
>
>
$a = new A ();
$b = new B ();
$c = new C ();
15 years ago
Nice trick with scope resolution
class A
public function TestFunc ()
return $this -> test ;
>
>
class B
public $test ;
public function __construct ()
$this -> test = «Nice trick» ;
>
public function GetTest ()
return A :: TestFunc ();
>
>
$b = new B ;
echo $b -> GetTest ();
?>
will output
16 years ago
This is a solution for those that still need to write code compatible with php 4 but would like to use the flexibility of static variables. PHP 4 does not support static variables within the class scope but it does support them within the scope of class methods. The following is a bit of a workaround to store data in static mode in php 4.
Note: This code also works in PHP 5.
(Tested on version 4.3.1+)
The tricky part is when using when arrays you have to do a bit of fancy coding to get or set individual elements in the array. The example code below should show you the basics of it though.
class StaticSample
//Copyright Michael White (www.crestidg.com) 2007
//You may use and modify this code but please keep this short copyright notice in tact.
//If you modify the code you may comment the changes you make and append your own copyright
//notice to mine. This code is not to be redistributed individually for sale but please use it as part
//of your projects and applications — free or non-free.
//Static workaround for php4 — even works with arrays — the trick is accessing the arrays.
//I used the format s_varname for my methods that employ this workaround. That keeps it
//similar to working with actual variables as much as possible.
//The s_ prefix immediately identifies it as a static variable workaround method while
//I’m looking thorugh my code.
function & s_foo ( $value = null , $remove = null )
static $s_var ; //Declare the static variable. The name here doesn’t matter — only the name of the method matters.
if( $remove )
if( is_array ( $value ))
if( is_array ( $s_var ))
foreach( $value as $key => $data )
unset( $s_var [ $key ]);
>
>
>
else
//You can’t just use unset() here because the static state of the variable will bring back the value next time you call the method.
$s_var = null ;
unset( $s_var );
>
//Make sure that you don’t set the value over again.
$value = null ;
>
if( $value )
if( is_array ( $value ))
if( is_array ( $s_var ))
//$s_var = array_merge($s_var, $value); //Doesn’t overwrite values. This adds them — a property of the array_merge() function.
foreach( $value as $key => $data )
$s_var [ $key ] = $data ; //Overwrites values.
>
>
else
$s_var = $value ;
>
>
else
$s_var = $value ;
>
>
echo «Working with non-array values.
» ;
echo «Before Setting: » . StaticSample :: s_foo ();
echo «
» ;
echo «While Setting: » . StaticSample :: s_foo ( «VALUE HERE» );
echo «
» ;
echo «After Setting: » . StaticSample :: s_foo ();
echo «
» ;
echo «While Removing: » . StaticSample :: s_foo ( null , 1 );
echo «
» ;
echo «After Removing: » . StaticSample :: s_foo ();
echo «
» ;
echo «Working with array values
» ;
$array = array( 0 => «cat» , 1 => «dog» , 2 => «monkey» );
echo «Set an array value: » ;
print_r ( StaticSample :: s_foo ( $array ));
echo «
» ;
//Here you need to get all the values in the array then sort through or choose the one(s) you want.
$all_elements = StaticSample :: s_foo ();
$middle_element = $all_elements [ 1 ];
echo «The middle element: » . $middle_element ;
echo «
» ;
$changed_array = array( 1 => «big dog» , 3 => «bat» , «bird» => «flamingo» );
echo «Changing the value: » ;
print_r ( StaticSample :: s_foo ( $changed_array ));
echo «
» ;
//All you have to do here is create an array with the keys you want to erase in it.
//If you want to erase all keys then don’t pass any array to the method.
$element_to_erase = array( 3 => null );
echo «Erasing the fourth element: » ;
$elements_left = StaticSample :: s_foo ( $element_to_erase , 1 );
print_r ( $elements_left );
echo «
» ;
echo «Enjoy!» ;
- Классы и объекты
- Введение
- Основы
- Свойства
- Константы классов
- Автоматическая загрузка классов
- Конструкторы и деструкторы
- Область видимости
- Наследование
- Оператор разрешения области видимости (::)
- Ключевое слово static
- Абстрактные классы
- Интерфейсы объектов
- Трейты
- Анонимные классы
- Перегрузка
- Итераторы объектов
- Магические методы
- Ключевое слово final
- Клонирование объектов
- Сравнение объектов
- Позднее статическое связывание
- Объекты и ссылки
- Сериализация объектов
- Ковариантность и контравариантность
- Журнал изменений ООП
- Copyright © 2001-2023 The PHP Group
- My PHP.net
- Contact
- Other PHP.net sites
- Privacy policy
QBASICBOOK.ru: сайт про QB64
Не стоит относиться к программированию, по крайней мере, к прикладному программированию, как к чему-то сложному и подвластному людям с «особым» складом ума. С основами программирования человек сталкивается повседневно, и даже не хочется приводить примеры, поскольку все это банально.
Программирование на компьютере с использованием языка программирования – это всего лишь формализованное общение с вычислительной техникой. Цель такого общения – объяснить ей, чего вы от нее хотите и добиться и получить адекватный результат. Необходимо объяснить четко, с соблюдением логики и здравого смысла. Что ж, попробуем в этом разобраться!
Настало время рассказать про двоеточие. Оно служит, чтобы в одной строке написать несколько выражений.
Рисунок 1 – Пример работы с двоеточием
В этом операторе, зачастую, нет особой необходимости, но если встретите его, просто знайте, что имеется в виду.
Немного поясню этот код. A, B – это имена переменных, то есть какие-то именованные ячейки в памяти. 2, 4 – это значения которые мы помещаем в эти ячейки памяти. Оператор присваивания (=) помогает нам в этом. Со всем этим мы познакомимся подробнее чуть позже. Здесь главное, что по сути у нас есть два выражения. Первое: A = 2, второе B = 4. Эти два выражения записаны в одну строку. Таким образом, при помощи двоеточия можно записать 2 и более выражений в одну строку.
В этой статье мне бы хотелось напомнить о том, как расшифровывается аббревиатура B.A.S.I.C.: Beginner’s All-purpose Symbolic Instruction Code – универсальный язык символических инструкций для начинающих.
На этом языке в последующих статьях мы будем писать наши первые алгоритмы. Что же это такое?
Алгоритм – это последовательность действий, приводящих к намеченному результату.
Алгоритм может быть представлен в обычной словесной форме в виде последовательности пронумерованных предложений.
Алгоритмы бывают трех видов:
- Линейный алгоритм – это такой алгоритм, в котором действия выполняются последовательно, в порядке расположения блоков;
- Разветвляющийся алгоритм, в отличие от линейного, содержит блок разветвления (или условия). В зависимости от выполнения условия выбирается один из двух (или более) различных вариантов вычислительного процесса. Затем вычислительный процесс опять сводится в одно русло. Для программирования разветвлений используются операторы условного и безусловного перехода;
- Циклическим алгоритмом называется алгоритм, часть которого выполняется многократно с различными значениями изменяющейся по определенному закону переменной (переменной цикла). Многократно повторяющаяся часть алгоритма, внутри которой переменная цикла не изменяется, называется телом цикла.
В программировании, на самом деле, не все так сложно как может показаться на первый взгляд, языки программирования имеют схожие, а иногда и одинаковые конструкции, алгоритмы вычисления чего-либо тоже всегда одни и те же.
Спасибо за прочтение этой статьи.
Для чего нужен оператор двоеточие, если два двоеточия — это оператор расширения области видимости
для чего нужен оператор двоеточие ( : ), если два двоеточия( :: ) — это оператор расширения области видимости.
Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:Оператор разрешения области видимости
Только начинаю изучать ООП. Объясните где и как применяется оператор разрешения области видимости.Для чего нужен оператор this?
Здравствуйте. Я совсем новичок. Недавно стал смотреть видео курс на ютубе. Дошел до прототипов.Для чего нужен оператор throw?
Объясните пожалуйста. А то в интернете найти ничего не могу. P.S. В MDSN непонятно написано.Для чего нужен оператор lock?
для чего нужен оператор lock? в смысле я уже загуглил — он заставляет код выполняться синхронно, но.13318 / 10624 / 6348
Регистрация: 18.12.2011
Сообщений: 28,3751 2 3 4 5
struct A { int n; A():n(0){} };
18467 / 9625 / 2355
Регистрация: 30.01.2014
Сообщений: 16,876Сообщение было отмечено Alexei9 как решение
Решение
Сообщение от Alexei9
оператор двоеточие
В С++ нет такого оператора. Стандарт не дает ему названия, можно считать, что это просто синтаксический разделитель.
Он используется в множестве мест в зависимости от контекста.
Как составная часть тернарного оператораint c = a b ? a : b;
Как обозначение начала списка инициализации конструктора
SomeClass() : a(1), b(2) {}
Как разделитель, обозначающий начало списка базовых классов при указании наследования
1 2 3
class SomeClass1 : public BaseClass1 {}; class SomeClass2 : public BaseClass1, public BaseClass2 {};
Как способ указания размерности битового поля
1 2 3 4
struct A { int a : 2; };
Как синтаксис задания типа в enum class (С++11)
1 2 3 4
enum : int { EN1, EN2 };
Как разделитель между for-range-declaration и expression в range-based for(C++11)
for(int & a : vec) { //.
Добавлено через 24 минуты
Еще два варианта использования забыл упомянуть:
Как окончание спецификатора доступа класса1 2 3 4 5
class A { public: void func(); };
Как окончание декларации метки для goto
1 2 3 4 5
goto mylabel; ///. mylabel: func();
Или меток в конструкции switch — case
1 2 3 4 5 6 7 8
switch(a) { case 1: //. break; default: ; };
Регистрация: 05.06.2015
Сообщений: 4
Регистрация: 05.06.2015
Сообщений: 4
в чем разница между : (двоеточие) и :: (двойное двоеточие) в языке С++
528 / 431 / 159
Регистрация: 25.11.2014
Сообщений: 1,662
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1Примерно такая же, как между ‘Государем’ и ‘милостивым государем’.
‘:’ — это разделитель (после метки, в тернарном операторе, в структуре итд.).
‘::’ — оператор области видимости.2441 / 1839 / 406
Регистрация: 15.12.2013
Сообщений: 8,225Alexei9, неужели здесь вам ответили не достаточно подробно?
https://www.cyberforum.ru/post7721283.htmlРегистрация: 05.06.2015
Сообщений: 4
преподавателю этого не хватило.
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
Alexei9, Преподаватель по танцам?21275 / 8292 / 637
Регистрация: 30.03.2009
Сообщений: 22,656
Записей в блоге: 30У оператора :: не было какой-то самоцели взять что-то и написать два раза подряд. Просто разделители (знаки типа точка, запятая, точка с запятой и т.п.) давным-давно закончились, вот и приходится разработчикам языка изголяться и переиспользовать один и тот же разделитель в разных синтаксических конструкциях. Т.е. символ один и тот же, но несёт разную смысловую нагрузку и по сути дела можно считать, что это символы «двоеточие номер 1», «двоеточие номер 2» и т.п.
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1Сообщение от Alexei9
не хватило
DrOffset дал исчерпывающий ответ.
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесьНюансы синтаксиса: для чего нужен оператор ->
Здравствуйте совсем недавно столкнулся с вот таким вот оператором. -> . Подскажите пожалуйста, что.Для чего нужен оператор using и в каких случаях он необходим?
Несколько раз сталкивался в C# с оператором using. Но не могу понять для чего он нужен. Сейчас.Для чего нужен пустой оператор writeln в массивах?
для чего нужен пустой оператор writeln в массивах?Для чего нужен оператор разрешения контекста (scope resolution operator)?
Объясните простым языком для чего нужен оператор " :: " , и какого он вида?Зачем нужен оператор while (именно while, а не do-while), когда есть оператор for?
Четкий и понятный ответ в литературе и на других web ресурсах не найден, поэтому вопрос к знатокам.Условный оператор и оператор выбора. Даны два угла треугольника. Определить, существует ли такой треугольник
Даны два угла треугольника (в градусах). Определить, существует ли такой треугольник, и если да, то.Или воспользуйтесь поиском по форуму:
Что означает двоеточие в программировании
В стандартной библиотеке C++ для управления наборами объектов существуют контейнеры. Таким образом, можно сказать, что контейнер — это коллекция объектов определенного типа. Если же мы говорим о последовательном контейнере (sequential container), то он дает возможность контролировать порядок, в котором существующие элементы располагаются в коллекции, причем не только контролировать, но и управлять доступом к данным элементам.
Поделиться
Андрей Павленко
01.06.22 в 18:26В языке C++ исключения описываются типом exception, определенном в заголовочном файле . Рассмотрим обработку исключений на примере:
Поделиться
Андрей Павленко
01.06.22 в 18:06В языке программирования C++ есть возможность использования динамических массивов. Для выделения памяти под такой массив применяется оператор new, после которого надо в квадратных скобках указать, сколько конкретно этот массив будет содержать объектов. Рассмотрим соответствующий пример:
Поделиться
Андрей Павленко
15.03.22 в 18:55В языке программирования C++ при чтении и записи часто используются объекты std::cout и std::cin. Префикс std:: в данном случае указывает, что объекты cout и cin определены в пространстве имен std. При этом двойное двоеточие :: представляет собой оператор области видимости (scope operator), позволяющий указывать, в каком конкретно пространстве имен определен этот объект. То есть без префикса использовать эти объекты мы не сможем.